奇怪的 DOLL + InteropServices 问题

Posted

技术标签:

【中文标题】奇怪的 DOLL + InteropServices 问题【英文标题】:Strange DLL + InterropServices problem 【发布时间】:2008-12-24 15:44:20 【问题描述】:

我正在尝试学习捆绑非托管 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

运行时输出

您好,2008 年的世界!

你好,来自 1986 年的世界!

按任意键退出

应该是这样,除了 VS2008 的发布模式(按 F5),我得到了

您好,2008 年的世界!

按任意键退出

现在,如果我去 Explorer 并在没有 VS 的情况下运行 FancyApp.exe 的发布版本,它运行良好。

想法?

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

【问题讨论】:

既然 printf 真的来自 C 时代,那应该是 1970 年的世界。:) 呵呵。我认为 1986 年大约是 Microsoft 提出 Windows 及其精美 DLL 的时间。 【参考方案1】:

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

既然这样有效,我们可以推断二进制文件已正确构建,因此不存在编译器问题,但您会看到一些奇怪的调试器工件。

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

【讨论】:

以上是关于奇怪的 DOLL + InteropServices 问题的主要内容,如果未能解决你的问题,请参考以下文章

leetcode@ [354] Russian Doll Envelopes (Dynamic Programming)

354. Russian Doll Envelopes

354. Russian Doll Envelopes

Leetcode: Russian Doll Envelopes

LeetCode 354. Russian Doll Envelopes

[动态规划] leetcode 354 Russian Doll Envelopes