我正在使用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>
答案 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 只在对话框中可见。这就是我将它添加到我的项目中的方式。
希望这有帮助。
答案 2 :(得分:0)
您无法使用“添加引用”对话框直接执行此操作。 exe文件期望dll与可执行文件位于同一路径中,或者应该注册它们(我不知道它是如何工作的)。添加引用对话框仅在该路径中复制这些dll。
我唯一的想法是动态dll发现哪个好(对于后期的,请参阅Mef),但我不知道是否使用紧凑的框架3.5。
最好的解决方案可能是将dll添加到exe文件的搜索路径中,这个问题是我到目前为止找到的唯一好资源: How to save DLLs in a different folder when compiling in Visual Studio?