【问题标题】:Unmanaged DLL project and managed WinForms application in one solution一个解决方案中的非托管 DLL 项目和托管 WinForms 应用程序
【发布时间】: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 子文件夹?

【问题讨论】:

    标签: c# .net c++ visual-studio


    【解决方案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 文件夹。

    【讨论】:

      猜你喜欢
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 2012-08-12
      • 2012-04-20
      • 1970-01-01
      相关资源
      最近更新 更多