我们上个月用一个简单的C风格API编写了一个非托管DLL。它很有效,一切都很好。
今天,我们正在使用此DLL编写演示应用程序。这是Visual Studio 2013中全新解决方案的一部分。它编译并运行正常,直到它尝试使用DLL的API,我们得到DllNotFoundException。
上周用测试控制台应用程序发生了同样的事情。廉价快速的解决方法是从其制作的工作空间中复制DLL,并将副本放入新工作区中项目文件夹中的bin / x64 / Debug /。问题消失了。
当然,我们今天可以为新的演示应用做同样的事情,并继续生活,但这似乎很傻。我们有几个测试和演示应用程序,以及提供给客户的应用程序,大约十五个左右。当然,我们不应该在每次更改之后手动将DLL复制到十五个不同的bin / x64 / Debug /中,用于十五个不同的项目。而且,因为我们也有Release版本。
尽管阅读了许多关于非托管DLL和解决方案和项目的博客,文章,MSDN页面,然后右键单击“添加引用...”#34;而且,我还没有看到任何明确的解释如何使用一个DLL处理多个项目。似乎应该有一些方法我们可以将DLL复制到一个地方,并告诉所有项目只需一次去看那里。
相关方面的问题:我们已经尝试过"添加引用..."事情,但它不喜欢我们的DLL。这不适用于用C编写的非托管DLL吗?我们没有看到一个明确的声明,我们是否应该使用添加参考。
答案 0 :(得分:2)
要运行程序,它需要所有依赖项都可用,因此必须将dll包含在您发送的文件集中。对于托管程序集,构建过程会自动复制这些文件,但对于非托管dll,您需要告诉构建系统该做什么。
通常的方法是
编辑构建后步骤(在应用程序的项目属性中)并添加一个copy / xcopy / robocppy命令,将文件复制到输出文件夹。您可以在文件名中嵌入宏以查找文件夹,以便项目保持可重定位。
将文件添加到项目中,并在解决方案资源管理器中获取其属性。然后将其设置为"如果更新"。
通过执行此操作,每次执行构建时都会复制最新版本的dll,您可以忘记它。