C#将所需的DLL放在输出根之外的某处

Ais*_*war 28 c# dll dependencies visual-studio

我正在使用EmguCV进行项目,当我们的程序运行时,它需要一些像"cxcore.dll"等dll(或者它会抛出运行时异常).目前,我将文件放在输出文件夹的根目录中(在Visual Studio的文件属性中选择"始终复制").

然而它看起来有点凌乱,只有10个不同的dll.有没有我可以将它移动到输出文件夹中的子文件夹,它仍然会找到它.

小智 64

到目前为止惊人的答案 没有权利;)嗯,

是的,您可以将程序集放在不同的位置.

在相应的应用程序配置(app.config将被复制到your.exe.config)中添加:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <probing privatePath="lib" />
  </assemblyBinding>
</runtime>
Run Code Online (Sandbox Code Playgroud)

根据:

http://msdn.microsoft.com/en-us/library/823z9h8w.aspx

这将使程序查看程序集的私有路径(它自己的文件夹下的文件夹) - 就像Web应用程序查找/ bin一样.

您也可以将它们放入GAC,但除非有其他原因,否则应该避免这种情况.

话虽这么说,你真的不需要.如果您在开始菜单中正确安装应用程序,用户不会感到困惑;)我从来没有遇到过这个问题,包括50多个程序集的项目.用户似乎永远不会看到它们.

  • 至于你的答案。您确定它可以与非托管库一起使用吗? (3认同)
  • 我尝试过,但是无法使其正常工作...所以我找到了一个解决方案,并将其发布在这里:/sf/answers/3584781301/ (2认同)

Svi*_*ish 21

要将程序集放在子目录中,您可以手动将它们复制到那里,使用预构建或后构建事件或完全不同的事件.

要加载它们,您可以使用AppDomain.AssemblyResolve事件,或(如TomTom所述)<probing>元素.来自MSDN:

以下示例说明如何指定运行时应搜索程序集的应用程序基础子目录.

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin2\subbin;bin3"/>
      </assemblyBinding>
   </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

GAC当然是另一个转储程序集的地方,但这并不算作子目录......除非你在某个地方安装你的应用程序它真的不应该安装:P


sag*_*gie -2

您可以使用构建前/构建后事件以及告诉您输出文件夹位置的宏将 dll 复制到您想要的位置。

但是,如果 dll 与可执行文件不在同一目录中,则不会加载它们。如果它们是托管的,您可以使用 Assembly.Load 方法手动加载它们。如果它们不受管理,我不知道你该怎么做。