P/Invoke 和 .NET 目标框架

P/Invoke and .NET Target Framework

这个问题让我感到困惑...只是说。

我的公司有一个遗留的 C++ 库,我的任务是创建一个 .NET 包装器。
我没有 C++ 或 P/Invoke 的经验,所以首先我尝试了一个简单的方法。

我已阅读official documentation and I have also found a nice tutorial
但是,我发现消费应用程序的目标 .NET 框架有所不同。
本教程中的 P/Invoke 代码工作正常,但我注意到他的目标是 .NET Framework 4 Client Profile.
如果我放置断点然后它们被击中并且一切都按预期工作,如果我针对高于 4 的框架那么程序毫无例外地崩溃。

我有一个用 C++ 定义的非常简单的方法:
framework.h

extern "C" {
    API char* SayHello();
}

dllmain.cpp

char* SayHello() {
    return (char*)"Hello";
}

C#

        [DllImport("PInvokeTest.dll")]
        public static extern string SayHello();

(我试过在属性上以不同的组合设置 CallingConvention 和 CharSet,我设法获得了汉字,但没有比 Framework 4 更高的版本)

我的 C++ 项目设置了 API=__declspec(dllexport) 预处理器定义,调用约定是 _stdcall (\Gz)(我也试过 _cdecl)。
C# 项目在 Framework 4 上运行良好,当我更改为高于该版本的任何内容时,它就会无一例外地退出。
我还发现 Dependencies GUI 向我展示 SayHello 确实存在。

我们公司使用的是 4.6.1,我也遇到过 this article which lead me to PInvokeStackImbalance,但这对我来说没有任何作用。

如有任何帮助,我们将不胜感激。
如果需要,我可以创建一个临时 GitHub 存储库。

现在我知道这是一个字符串问题,我做了一些搜索,我找到了 this SO question
所以最后我使用了BSTR的方法。

BSTR SayHello() {
    return ::SysAllocString(L"Hello");
}
        [DllImport("DBReplicator.Lib.dll")]
        [return: MarshalAs(UnmanagedType.BStr)]
        public static extern string SayHello();

...不过还是不知道我是怎么弄到汉字的。