7

我有一个我制作的类库项目。我们称之为A类。在 ClassA 中,我需要访问一些驻留在 dll (ToolsDLL.dll) 中的工具。

在 ClassA 中,我已将 ToolsDLL.dll 添加到项目中,并始终选择将 ToolsDLL.dll 文件复制到输出目录。因此该库可以正常构建和编译,并且在输出目录中我看到 ClassA.dll 以及 ToolsDLL.dll

接下来,我想编写一个应用程序,比如说 App_A,它使用 ClassA 中的方法。因此,在我的 App_A 项目中,我添加了对 ClassA.dll 的引用,以便我可以访问它的命名空间。一切都很好,它可以构建/编译。

问题是,一旦我运行 App_A 并到达需要使用 ToolsDLL.dll 的地步,它就会抛出异常“无法加载 ToolsDLL.dll。我不明白它怎么可能找不到该 dll 因为它与 ClassA.dll 位于同一目录中。

我发现如果我将 ToolsDLL.dll 放在 App_A 的输出目录中,它就可以正常工作。有什么办法吗?有什么方法可以将 ToolsDll.dll 与 ClassA.dll 捆绑在一起。原因是我的客户将编写自己的类似于 AppA 的应用程序,如果他们只需要在项目中引用一个文件而不是多个文件,那就太好了。

4

4 回答 4

12

微软有一个工具叫做ILMerge. 它可能会做你想做的事,将几个程序集捆绑到一个文件中。

PS:解决您的问题的另一个相当常用的解决方案是将构建后事件添加到应用程序的解决方案/项目中,将所需的内容复制ToolsDLL.dll到输出目录?类似的东西:

xcopy /y /d $(SolutionDir)\lib\ToolsDLL.dll $(OutputDir)\ToolsDLL.dll

(对不起,如果我弄错了,我是从记忆中输入的。)

当然,您的客户也必须这样做。但话又说回来,他们可能以前也这样做过。

于 2010-01-05T16:39:04.130 回答
1

您是否已将 DLL 添加到项目中,或者您是否实际添加了对它的引用?你应该做后者,然后这种事情会自动为你处理。听起来您已将实际文件添加到项目文件中,并将其设置为复制。

如果您确实想要单一文件方法,那么ILMerge显然接受其他人的建议......

于 2010-01-05T16:39:23.567 回答
0

您可以使用 ILMerge 将程序集组合到一个 DLL 中。

https://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx

于 2010-01-05T16:39:51.490 回答
0

您可以使用 IL 合并工具,也可以在 GAC 中安装 ToolsDLL.dll。

此外,如果您查看 App_A 的输出,ClassA.dll 已经存在,那就是它正在寻找 ToolsDLL.dll 的地方。

于 2010-01-05T16:40:35.623 回答