奇怪的DLL + InterropServices问题

时间:2008-12-24 15:44:21

标签: c# c++ dll interop

我正在尝试学习捆绑非托管C ++和.NET的基础知识。所以,我已经从C#编译和调用了DLL。大。现在我遇到了这个奇怪的问题:

这是我的C ++文件,Main.cpp

#include <stdio.h>

extern "C" __declspec(dllexport) void DisplayHelloFromDLL()
{
    printf ("Hello from the World of 1986!\n");
}

和C#文件,Program.cs

using System; using System.Runtime.InteropServices;

namespace FancyApp {
    class Program
    {
        [DllImport("ConsoleApp.dll")]
        public static extern void DisplayHelloFromDLL();

        static void Main()
        {
            Console.WriteLine("Hello form the World of 2008!");
            DisplayHelloFromDLL();

            Console.WriteLine("Press any key to exit");
            Console.ReadKey();


       }
    }
}

足够简单。构建时,我从C ++端获得ConsoleApp.dll,从C#获得FancyApp.exe

运行时,输出

  

Hello from the World of 2008!

     

1986年的世界你好!

     

按任意键退出

应该如此,除了VS2008的发布模式(按F5),我得到了

  

Hello from the World of 2008!

     

按任意键退出

现在,如果我转到资源管理器并在没有VS的情况下运行FancyApp.exe的发布版本,它运行正常。

想法?

我上传了我的解决方案文件夹here(180kb)。

1 个答案:

答案 0 :(得分:3)

我在这里看到了相同的行为,我无法完全解释它。但是我认为尝试针对Release版本在调试模式(F5)下运行,您应该期待未定义的行为。如果我使用ctrl-F5它运行正常。

由于这是有效的,我们可以推断二进制文件是否正确构建,因此没有编译器问题,而是你看到调试器的一些奇怪的工件。

这可以通过进入FancyApp的属性并在Debug选项卡上取消选中'启用Visual Studio托管进程'来证明。如果你这样做,它会像你期望的那样工作。为什么,确切地说,我不能说。这里的教训是不要尝试调试发布版本。