Dav*_*ide 0 .net c# c++ pinvoke unmanaged
我有一个非托管 C++ DLL 和一个使用 P/Invoke 进行通信的 .net 应用程序。我需要从 C++ DLL 更新 .net 应用程序中的字典。
我尝试通过以下方式做到这一点:
public delegate void MyDelegate(string address, string username);
[DllImport("MyDLL.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void SaveMyDelegate(MyDelegate callback);
private static SortedDictionary<string, string> dict = new SortedDictionary<string, string>();
public void save_delegate() {
SaveMyDelegate(delegate(string address, string username) {
if (username != "") {
dict.Add(address, username);
}
});
}
Run Code Online (Sandbox Code Playgroud)
在 C++ 方面我有:
typedef void (*MANAGED_CALLBACK)(string user_address, string username);
extern "C" __declspec(dllexport) void SaveMyDelegate(MANAGED_CALLBACK callback);
MANAGED_CALLBACK my_callback;
void SaveMyDelegate(MANAGED_CALLBACK callback) {
my_callback = callback;
}
extern "C" __declspec(dllexport) VOID start_collection();
VOID start_collection() {
my_callback("test", "User");
}
Run Code Online (Sandbox Code Playgroud)
在 C# 上,我执行以下调用:
[DllImport("MyDLL.dll")]
public static extern void start_collection();
private void Button1_Click(object sender, EventArgs e) {
save_delegate();
start_collection();
}
Run Code Online (Sandbox Code Playgroud)
当我调用start_collection () 时,我收到AccessViolation异常。我尝试通过以下方式声明委托:
public delegate void MyDelegate(
[MarshalAs(UnmanagedType.LPStr)]string address,
[MarshalAs(UnmanagedType.LPStr)]string username);
Run Code Online (Sandbox Code Playgroud)
我还添加了这样的声明:
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void MyDelegate(...)
Run Code Online (Sandbox Code Playgroud)
我没有查看代码的每个细节,但一些常见的 p/invoke 问题立即出现:
c_str()使用的方法获得这些std::string。cdecl需要使用该属性。[UnmanagedFunctionPointer(CallingConvention.Cdecl)]| 归档时间: |
|
| 查看次数: |
1104 次 |
| 最近记录: |