C#将所需DLL放在输出根以外的其他位置

C#将所需DLL放在输出根以外的其他位置,c#,visual-studio,dll,dependencies,C#,Visual Studio,Dll,Dependencies,我正在为一个项目使用EmguCV,当我们的程序运行时,它需要一些dll,如“cxcore.dll”等(或者它抛出运行时异常)。目前,我将文件放在输出文件夹的根目录中(在VisualStudio的文件属性中选择“始终复制”) 然而,它看起来有点混乱,有大约10个不同的DLL就在那里。是否有某种方法可以将其移动到输出文件夹中的子文件夹中,它仍然可以找到它。您可以使用生成前/生成后事件以及告诉您输出文件夹所在位置的宏将dll复制到所需的位置 但是,如果dll与可执行文件不在同一目录中,则不会加载它们。

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


然而,它看起来有点混乱,有大约10个不同的DLL就在那里。是否有某种方法可以将其移动到输出文件夹中的子文件夹中,它仍然可以找到它。

您可以使用生成前/生成后事件以及告诉您输出文件夹所在位置的宏将dll复制到所需的位置

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

你可以把它放在其他地方,仍然链接它。在引用属性中,将“复制本地”设置为false,并相应地设置路径。这会奏效的。如果外部DLL要更改版本,您可以将“特定版本”设置为false,以便能够链接到任何版本。

到目前为止,令人惊讶的答案。没有权利;)那么

是的,您可以将部件放置在不同的位置

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


这将使程序查找程序集的专用路径(它自己的文件夹下的文件夹),就像web应用程序查找/bin一样

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


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

要在子目录中获取程序集,您可以手动将它们复制到那里,使用编译前或编译后事件或完全不同的方法

要加载它们,可以使用或(如所述)。从MSDN:

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



GAC当然是转储程序集的另一个地方,但它并不能算作子目录。。。除非您将应用程序安装到某个位置,否则它确实不应该安装:P

小心构建前/后事件,尤其是在您使用多个开发人员和/或自动构建的环境中。它们可能是大问题。您是想从其他位置引用它们(即包含在所有其他依赖库中),还是将它们放在bin目录下的子文件夹中?这些文件是否也包含在项目中,或者应用程序是否已加载(Assembly.Load或P/Invoked)?@Gray:我想将它们放在我的bin目录下的子文件夹中。我不直接使用这些DLL,但它们是由EmguCV项目使用的(我相信它们是P/C调用的)。此外,我认为DLL本身是用C编写的。如果没有DLL,我仍然可以构建,但我会得到一个运行时异常。@Tom Svish的答案是正确的,您的答案也是正确的。您确定它可以与非托管libs一起使用吗?@TomTom:上面的内容是否在我的
.csproj
文件中?我的项目是一个C#winforms应用程序-我找不到
.config
文件。Swish答案也是在我之后完成的。该条目将进入appications配置文件。阅读.config文件-真的。这是.NET基础知识。添加itme,它将显示应用程序配置。结果是名为“app.config”的XML文件被复制到内置的“your.exe.config”中。这是您可以进行运行时配置的地方-类似于web应用程序中的web.config(实际上是同一个文件)。仔细阅读。我试过了,但我不能让它正常工作。。。因此,我找到了一个解决方案并发布在这里:@Svish:上面的内容是否会在我的.csproj文件中?我的项目是一个C#winforms应用程序-我找不到.config文件。@aip.cd.aish:在上有一个更完整的示例。如果没有配置文件,您可以创建一个。根据,它应该与您的应用程序同名,扩展名为.config。该文件也可能仅命名为app.config。。。但我不确定。阅读MSDN上的配置文件,您应该会发现:)