多个 C# 项目如何在不进行繁琐的手动复制的情况下使用非托管 DLL?

How can several C# Projects use an unmanaged DLL, without tedious manual copying?

我们上个月用简单的 C 风格写了一个非托管 DLL API。一切正常。

今天,我们正在使用此 DLL 编写一个演示应用程序。这是 Visual Studio 2013 中全新解决方案的一部分。它编译并运行良好,直到它尝试使用 DLL 的 API,我们在那里得到 DllNotFoundException。

上周测试控制台应用程序也发生了同样的事情。便宜快速的解决方法是从创建它的工作区复制 DLL,然后将副本复制到新工作区项目文件夹中的 bin/x64/Debug/ 中。问题消失了。

当然,我们今天可以为新的演示应用程序做同样的事情,继续生活,但这看起来很愚蠢。我们有几个测试和演示应用程序,以及要提供给客户的应用程序,大约有 15 个。当然,我们不应该在每次更改后手动将 DLL 复制到十五个不同的 bin/x64/Debug/ 以用于十五个不同的项目。还有更多,因为我们也会有发布版本。

尽管阅读了许多关于非托管 DLL 和解决方案和项目的博客、文章、MSDN 页面并右键单击 "Add References..." 等等,但我没有看到任何明确的解释应该如何处理多个项目使用一个 DLL。似乎应该有某种方法可以将 DLL 复制到一个地方,并告诉所有项目一次去那里看。

相关的附带问题:我们已经尝试了 "Add References..." 事情,但它不喜欢我们的 DLL。这不适用于用 C 编写的非托管 DLL 吗?我们没有看到是否应该使用添加引用的明确声明。

为了让您的程序 运行 它需要所有依赖项都可用,因此 dll 必须包含在您提供的文件集中。对于托管程序集,构建过程会自动复制这些文件,但对于非托管 dll,您需要告诉构建系统要做什么。

通常的方法是

  • 编辑 post-build 步骤(在应用程序的项目属性中)并添加 copy/xcopy/robocppy 命令以将文件复制到输出文件夹。您可以在文件名中嵌入宏来定位文件夹,以便项目保持可重定位。

  • 将文件添加到项目并在解决方案资源管理器中获取其属性。然后设置为"copied if newer".

通过这样做,每次构建时都会复制最新版本的 dll,您可以忘记它。