【问题标题】:Compact Framework - Place Dependencies (dlls) in a subfolderCompact Framework - 将依赖项(dll)放在子文件夹中
【发布时间】:2012-02-12 01:19:44
【问题描述】:

我正在使用 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>

【问题讨论】:

  • 您希望它们在开发环境或目标设备上的子文件夹中?
  • 在目标上(我更新了我的问题)。
  • 应用程序根目录之外的引用程序集必须具有强名称。 - MSDN (msdn.microsoft.com/en-us/library/15hyw9x3.aspx)
  • @leppie - 这不是真的,probing 指令告诉运行时在子文件夹(在本例中为 lib)中查找程序集,如果它无法在根目录中找到它们,它们不会不需要有强名称。但这是在完整的框架上。紧凑的框架似乎忽略了app.config 文件。

标签: c# .net compact-framework


【解决方案1】:

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

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

要在项目的文件夹结构中添加对 DLL 的引用,您应该能够右键单击 References 部分并选择Add Reference。

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      compact 框架不支持在 app.config 文件中设置探测路径。不过,您可以尝试一些解决方法。

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

      托管程序集的第二个选项是在出现时手动加载程序集 - 在您使用目标中的任何类之前。调用Assembly.LoadFrom 加载它,然后CLR 就可以加载它了。

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

      【讨论】:

      • 我只是放弃并将 dll 放在同一个文件夹中。但是,Assembly.LoadFrom(...) 听起来不错。也许在下一次重构中我会尝试。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多