我正在使用EmguCV进行项目,当我们的程序运行时,它需要一些像“cxcore.dll”等dll(或者它会抛出运行时异常)。目前,我将文件放在输出文件夹的根目录中(在Visual Studio的文件属性中选择“始终复制”)。
然而,看起来有点凌乱,只有10个不同的dll。有没有我可以将它移动到输出文件夹中的子文件夹,它仍然会找到它。
答案 0 :(得分:61)
到目前为止的惊人答案。没有权利;)好吧,
是的,您可以将程序集放在不同的位置。
在相应的应用程序配置中(app.config
被复制到your.exe.config
)添加:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="lib" />
</assemblyBinding>
</runtime>
根据:
http://msdn.microsoft.com/en-us/library/823z9h8w.aspx
这将使程序查看程序集的私有路径(它自己的文件夹下的文件夹) - 就像Web应用程序查找/ bin一样。
您也可以将它们放入GAC,但除非有其他原因,否则应该避免这种情况。
话虽如此,你真的不需要。如果您在开始菜单中正确安装应用程序,用户不会感到困惑;)我从来没有遇到过这个问题,包括50多个程序集的项目。用户似乎永远不会看到它们。
答案 1 :(得分:20)
要将程序集放在子目录中,您可以手动将它们复制到那里,使用预建或事件后事件或完全不同的事件。
要加载它们,您可以使用AppDomain.AssemblyResolve Event或(TomTom所示)<probing>
Element。来自MSDN:
以下示例显示如何指定运行时应搜索程序集的应用程序基础子目录。
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2\subbin;bin3"/>
</assemblyBinding>
</runtime>
</configuration>
GAC当然是另一个转储程序集的地方,但这不会真正算作子目录......除非你在某个地方安装应用程序,否则它确实不应该安装:P
答案 2 :(得分:-2)
您可以使用前/后构建事件将dll复制到所需的位置,以及告诉您输出文件夹位置的宏。
但是,如果dll与可执行文件不在同一目录中,则不会加载它们。 如果它们是托管的,您可以使用Assembly.Load方法手动加载它们。 如果他们没有管理,我不知道你怎么做。
答案 3 :(得分:-3)
您可以将其保留在其他位置并仍然将其链接。在引用属性中,将“Copy local”设置为false并相应地设置路径。这会奏效。如果外部DLLS要更改版本,您可以将“特定版本”设置为false,以便能够链接到任何版本。