一个解决方案中的非托管 DLL 项目和托管 WinForms 应用程序

Posted

技术标签:

【中文标题】一个解决方案中的非托管 DLL 项目和托管 WinForms 应用程序【英文标题】:Unmanaged DLL project and managed WinForms application in one solution 【发布时间】:2011-03-02 14:02:56 【问题描述】:

我正在使用 Visual Studio 2008 Professional,我需要创建包含两个项目的解决方案。第一个项目是托管的 WinForms C# 项目,第二个是非托管的 DLL C++ 项目。

我在 VS2008 和非托管 DLL 项目中创建了它们,我导出了返回一些 int 的简单函数。在托管的 WinForms 项目中,我以通常的方式导入 DLL 并尝试在标签中打印返回值:

[DllImport("DllProj.dll", EntryPoint = "GetSomeInt", SetLastError = true)]
private static extern int GetSomeInt();

但是当我构建解决方案并运行时,我得到DllNotFoundException。我还尝试将现有项目(DllProj.dll)添加到 WinForms 项目,但它只将该 dll 从其 Debug 文件夹复制到 WinForms 项目的文件夹,而不是在已编译项目所在的 Debug 子文件夹中。所以我仍然收到DllNotFoundException

我也尝试将它添加为引用,但 VS2008 抱怨我的 DLL 不是 COM 或托管对象。是否有某种方法可以配置解决方案,这样我就不需要在每次构建后手动将编译后的 DLL 复制到 WinForms 项目的 Debug 子文件夹?

【问题讨论】:

【参考方案1】:

您应该添加 dll 副本以发布构建事件。

Project properties>Build events>Post build event command line

【讨论】:

好的,我在那儿,我看到了构建后事件命令行。你能告诉我那个可以复制它的魔法命令吗?抱歉,我是第一次这样做,以前从未使用过。 使用简单的 bat 文件语法。例如“复制 c:\MyProjectSource\mydll.dll c:\MyDestination\” @sanjuro,当您将解决方案移动到另一个目录时,您必须使用像这样的宏 ('$(OutDir)') 或相对路径来防止中断。 @sanjuro,你也可以使用目标Output path项目属性【参考方案2】: 每次构建后将编译好的 dll 复制到 WinForms 项目中 右键单击 dll(位于 WinForms 项目中),单击属性 将“复制到输出目录”设置为“如果较新则复制”

【讨论】:

谢谢伙计,它可以工作,但是当我在 dll 项目中更改某些内容时,它不会反映在 WinForms 应用程序的结果中。所以没有办法像我想象的那样配置它?不需要每次我更改dll来手动复制它? @sanjuro,正如我所说,您应该添加复制脚本来发布项目的构建事件。每次构建后都会运行构建后事件。 我从您以前的帖子中知道,但不知道该复制脚本的外观。 :) @sanjuro,我添加了评论 :)【参考方案3】:

DllImport 是使用非托管 dll 的正确方法,因为 c++ 项目是非托管的,因此您无法在 c# windowsforms 应用程序中将其添加为引用,您必须手动或使用 postbuild 事件将 DllImport 使用的 c++ dll 复制到托管应用的 bin 文件夹。

【讨论】:

以上是关于一个解决方案中的非托管 DLL 项目和托管 WinForms 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

编写用于 C# 的非托管 C++ DLL

如何添加对由 C# 项目调用的非托管 C++ 项目的引用?

同名的非托管 C++ DLL 共存于同一进程中

将非托管 C++ dll 添加到托管 C++ dll

几个appdomains调用相同的非托管DLL

从 C# 线程内的非托管 dll 运行函数