我正在尝试学习捆绑非托管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)。
答案 0 :(得分:3)
我在这里看到了相同的行为,我无法完全解释它。但是我认为尝试针对Release版本在调试模式(F5)下运行,您应该期待未定义的行为。如果我使用ctrl-F5它运行正常。
由于这是有效的,我们可以推断二进制文件是否正确构建,因此没有编译器问题,而是你看到调试器的一些奇怪的工件。
这可以通过进入FancyApp的属性并在Debug选项卡上取消选中'启用Visual Studio托管进程'来证明。如果你这样做,它会像你期望的那样工作。为什么,确切地说,我不能说。这里的教训是不要尝试调试发布版本。