奇怪的 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)
Leetcode: Russian Doll Envelopes