[英]C# delegate callback with params cause AccessViolation when calling from C++ DLL
我有一个非托管的C ++ DLL和一个.NET应用程序,它们使用P / Invoke进行通信。 我需要从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);
}
});
}
在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");
}
在C#上,我执行以下调用:
[DllImport("MyDLL.dll")]
public static extern void start_collection();
private void Button1_Click(object sender, EventArgs e) {
save_delegate();
start_collection();
}
当我调用start_collection ()时,出现AccessViolation异常。 我试图通过以下方式声明委托:
public delegate void MyDelegate(
[MarshalAs(UnmanagedType.LPStr)]string address,
[MarshalAs(UnmanagedType.LPStr)]string username);
我还添加了以下语句:
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void MyDelegate(...)
我没有查看您代码的每个细节,但立即发现了一些常见的p / invoke问题:
std::string
的c_str()
方法获取它们。 cdecl
,因此在C#中声明委托类型时,需要使用[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.