Компактный каркас - Поместите зависимости (DLL) в подпапку - PullRequest
1 голос
/ 17 января 2012

Я занимаюсь разработкой приложения для Windows CE с использованием Visual Studio 2008 и Compact Framework 3.5.

Теперь я хочу поместить необходимые dll-файлы в подпапку в основной exe-файл. Это возможно? Это решение не работает для Windows CE.

Edit:

Я хочу, чтобы зависимости жили в подпапке на клиентском устройстве.

В настоящее время структура моей папки выглядит следующим образом (все в одном каталоге)

-- folder\
------ main.exe
------ controls.dll
------ webservice.dll
------ businesslogig.dll
------ nlog.dll

что я хочу:

-- folder\
------ main.exe
------ lib\
--------- controls.dll
--------- webservice.dll
--------- businesslogic.dll
--------- nlog.dll

это возможно на рабочем столе с настройкой в ​​файле app.config:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="lib" />
    </assemblyBinding>
  </runtime>

Ответы [ 3 ]

3 голосов
/ 18 января 2012

Компактный каркас не поддерживает настройку пути зондирования в файле app.config. Хотя есть несколько вещей, которые вы можете попробовать в качестве обходного пути.

Моим первым предположением было бы добавить подпапку в путь поиска системного загрузчика, хотя я не знаю, действительно ли я когда-либо пробовал ее для управляемых сборок. Чтобы расширить путь к загрузчику, просто добавьте ваш путь в качестве еще одной строки в разделе реестра MULTI_SZ по адресу [HKLM\Loader\SystemPath]. Я также не уверен, требует ли это мягкого сброса, чтобы заставить ОС принять изменения. Вещание WM_SETTINGSCHANGE также стоит попробовать.

Второй вариант для управляемых сборок состоит в том, чтобы вручную загрузить сборку, когда вы подойдете, - прежде чем использовать какие-либо классы из цели. Вызовите Assembly.LoadFrom, чтобы загрузить его, и в этот момент CLR сможет загрузить его.

Второй вариант для собственных библиотек DLL - вызвать P / Invoke для DLL с полным путем к цели. После загрузки первым P / Invoke любые дальнейшие вызовы имени dll (даже без пути) будут корректно разрешены, так как он будет использовать только внутренний дескриптор, полученный с помощью LoadLibrary.

1 голос
/ 17 января 2012

Вы должны иметь возможность размещать нужные библиотеки DLL в любом месте.

Очевидно, что их расположение в структуре папок вашего проекта имеет смысл!

Чтобы добавить ссылку на DLL в структуру папок вашего проекта, вы просто должны иметь возможность Щелкните правой кнопкой мыши в разделе Ссылки и выберите Добавить ссылку .

Обратите внимание на скриншот, что SQLite.Interop.066.DLL просто виден в диалоговом окне. Вот как я добавил его в свой проект.

Надеюсь, это поможет.

screenshot

0 голосов
/ 17 января 2012

Вы не можете сделать это напрямую с помощью диалога «Добавить ссылку».Exe-файл ожидает, что DLL находятся в том же пути к исполняемому файлу, или они должны быть зарегистрированы (и я не знаю, как это работает).В диалоговом окне «Добавить ссылку» скопируйте эти dll только по этому пути.

Единственная идея, которую я имею, - это динамическое обнаружение dll, которое хорошо (для позднего отмывания, см. Mef), однако я не знаю, с компактной платформой 3.5.

Лучшее решение, возможно, это добавить dll в путь поиска exe-файла. Этот вопрос является единственным хорошим ресурсом, который я нашел до сих пор: Как сохранить DLL в другой папке при компиляции вVisual Studio?

...