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();
...不过还是不知道我是怎么弄到汉字的。
这个问题让我感到困惑...只是说。
我的公司有一个遗留的 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();
...不过还是不知道我是怎么弄到汉字的。