我有一个我已经制作的类库项目。我们称之为ClassA。在ClassA中,我需要访问一些驻留在DLL中的工具(ToolsDLL.dll)。
在ClassA中,我将ToolsDLL.dll添加到项目中,并选择ToolsDLL.dll文件复制到输出目录ALWAYS。所以库构建和编译就好了,在输出目录中我看到ClassA.dll和ToolsDLL.dll
接下来,我想编写一个应用程序,比如使用ClassA中的方法的App_A。因此,在我的App_A项目中,我添加了对ClassA.dll的引用,以便我可以访问它的命名空间。一切都很好,它构建/编译。
问题是,当我运行App_A并且它到达需要使用ToolsDLL.dll的点时,它会引发异常“无法加载ToolsDLL.dll。我不明白它是如何可能的找不到该DLL,因为它与ClassA.dll位于同一目录中。
我发现如果我将ToolsDLL.dll放在App_A的输出目录中,它就可以了。那有什么办法吗?有没有什么方法可以将ToolsDll.dll以某种方式与ClassA.dll捆绑在一起。原因是我的客户将编写他们自己的类似于AppA的应用程序,如果他们只需要在他们的项目中引用一个文件而不是多个文件就会很好。
答案 0 :(得分:12)
Microsoft提供了一个名为ILMerge
的工具。它可能会做你想要的,将几个程序集捆绑到一个文件中。
PS :另一个经常使用的问题解决方案是在应用程序的解决方案/项目中添加一个后期构建事件,将所需的ToolsDLL.dll
复制到输出目录?类似的东西:
xcopy /y /d $(SolutionDir)\lib\ToolsDLL.dll $(OutputDir)\ToolsDLL.dll
(对不起,如果我弄错了,我正在记忆中输入这个。)
当然,您的客户也必须这样做。但他们之前可能再次这样做了。
答案 1 :(得分:1)
您是否已将DLL添加到项目中,或者您是否实际添加了对它的引用?你应该做后者,然后这种事情会自动为你照顾。听起来您已将实际文件添加到项目文件中,并将其设置为复制。
如果您确实需要单一文件方法,那么明显接受其他人ILMerge
的建议......
答案 2 :(得分:0)
您可以使用ILMerge将程序集合并到一个DLL中。
https://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx
答案 3 :(得分:0)
您可以使用IL合并工具,也可以在GAC中安装ToolsDLL.dll。
另外,如果您查看App_A的输出,ClassA.dll已经存在,那就是它正在寻找ToolsDLL.dll。