Compact Framework - 将依赖项(dll)放在子文件夹中

时间:2012-01-17 07:47:59

标签: c# .net compact-framework

我正在使用Visual Studio 2008和Compact Framework 3.5开发Windows CE应用程序。

现在我想将所需的dll放在主exe文件的子文件夹中。那可能吗? This solution不适用于Windows CE。

修改

我希望依赖项存在于客户端设备的子文件夹中。

目前我的文件夹结构如下所示(单个目录中的所有内容)

-- 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 个答案:

答案 0 :(得分:3)

紧凑框架不支持在app.config文件中设置探测路径。不过,有几件事可以尝试作为解决方法。

我的第一个猜测是将子文件夹添加到系统加载器的搜索路径,但我不知道我实际上已经尝试过托管组件。要扩展加载器路径,只需将您的路径作为另一个字符串添加到[HKLM\Loader\SystemPath]的MULTI_SZ注册表项中。我也不确定这是否需要软复位才能让操作系统接收更改。广播WM_SETTINGSCHANGE也可能值得一试。

托管程序集的第二个选项是在您启动时手动加载程序集 - 在使用目标中的任何类之前。调用Assembly.LoadFrom将其加载,此时CLR将能够加载它。

本机DLL的第二个选项是使用目标的完整路径调用DLL上的P / Invoke。一旦被第一个P / Invoke加载,对dll名称的任何进一步调用(即使没有路径)都将正确解析,因为它只使用LoadLibrary检索的内部句柄。

答案 1 :(得分:1)

您应该能够将所需的DLL放在任何您想要的位置。

显然,将它们放在项目的文件夹结构中是有道理的!

要在项目的文件夹结构中添加对DLL的引用,您应该只需右键单击 引用部分,然后选择添加引用< /强>

请注意,在屏幕截图中, SQLite.Interop.066.DLL 只在对话框中可见。这就是我将它添加到我的项目中的方式。

希望这有帮助。

screenshot

答案 2 :(得分:0)

您无法使用“添加引用”对话框直接执行此操作。 exe文件期望dll与可执行文件位于同一路径中,或者应该注册它们(我不知道它是如何工作的)。添加引用对话框仅在该路径中复制这些dll。

我唯一的想法是动态dll发现哪个好(对于后期的,请参阅Mef),但我不知道是否使用紧凑的框架3.5。

最好的解决方案可能是将dll添加到exe文件的搜索路径中,这个问题是我到目前为止找到的唯一好资源: How to save DLLs in a different folder when compiling in Visual Studio?