奇怪的DLL+;交叉服务问题 我试图学习捆绑非托管C++和.NET的基础知识。因此,我已经编译了DLL,并可以从C#调用它。伟大的现在我遇到了一个奇怪的问题:

奇怪的DLL+;交叉服务问题 我试图学习捆绑非托管C++和.NET的基础知识。因此,我已经编译了DLL,并可以从C#调用它。伟大的现在我遇到了一个奇怪的问题:,c#,c++,dll,interop,C#,C++,Dll,Interop,这是我的C++文件,主体.CPP < /代码>: #include <stdio.h> extern "C" __declspec(dllexport) void DisplayHelloFromDLL() { printf ("Hello from the World of 1986!\n"); } 很简单。在构建时,我从C++方面获得 COUNSOLAPP.DLL,以及< Cy.< /P> FANCYAPAP.exe < /代码>。 运行时,它会输出 大家好,来自2

这是我的C++文件,<代码>主体.CPP < /代码>:

#include <stdio.h>

extern "C" __declspec(dllexport) void DisplayHelloFromDLL()
{
    printf ("Hello from the World of 1986!\n");
}
很简单。在构建时,我从C++方面获得 COUNSOLAPP.DLL,以及< Cy.< /P> <代码> FANCYAPAP.exe < /代码>。 运行时,它会输出

大家好,来自2008年的世界

1986年的世界你好

按任意键退出

正如它应该的那样,除了在VS2008的发布模式下(按F5),我得到

大家好,来自2008年的世界

按任意键退出

现在,如果我转到Explorer,在没有VS的情况下运行
FancyApp.exe
的发行版,它运行得很好

想法


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

我在这里看到了相同的行为,我无法完全解释它。然而,我认为,尝试针对发布版本在调试模式(F5)下运行时,应该会出现未定义的行为。如果我使用ctrl-F5,它会正常运行

由于这是可行的,我们可以推断二进制代码是正确构建的,因此没有编译器问题,但是您看到的是一些奇怪的调试器工件


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

因为printf实际上来自C时代,那应该是1970年的世界。:)呵呵。我想,1986年大概是微软推出Windows及其奇特的DLL的时候。
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();


       }
    }
}