visual c++-如何将win32应用程序中的c++方法的地址传递给具有Action委托参数方法的c#方法
本文关键字:方法 Action 参数 址传 地址 win32 应用程序 visual c++ c++- | 更新日期: 2023-09-27 18:00:31
我有一个使用C#库的win32应用程序。
C#库有一个方法,其中Action<T>
委托是一个参数,如图所示:
public NetSocket(Action<int, int, string> action)
我在win32应用程序中有一个ref类,它的方法与Action委托签名相匹配。
如何将此方法作为上面列出的NetSocket
方法中的Action参数传递?
Ben您的解决方案似乎有效,但在将win32应用程序中操作委托方法的System:Sting
^输入参数与C#代码中操作委托的String
输入参数匹配时出现编译错误。c#代码中的Action委托使用String
作为输入参数,win32代码中的Action委托方法尝试使用System::String^
进行匹配,但不起作用。
//win 32应用程序-
void ServerClass::ActionMethod(int iCommand, int iClientIndex, System::String^ message)
//win32应用程序-服务器=
gcnew NetSockets::NetSocket(gcnew Action(this,&ServerClass::ActionMethod));
//csharp-
public NetSocket(Action<int, int, string> action)
是否有一些封送处理方法需要我使用,以将win32代码中使用的System::String
与C#中使用的字符串相匹配?我通过System::String
考试错了吗?还是必须做其他事情?我必须做些什么才能将System::String^
消息参数与字符串参数相匹配
感谢
已经更正我尝试了你的解决方案,它给出了以下错误:
1错误C3352:
'void ServerClass::ActionMethod(int,int,System::String ^)'
:指定的函数与委托类型'void (void)'
不匹配
@本:越来越近了。现在,当我使用您的解决方案编译代码时,我得到了一个内部编译错误,如图所示:
错误C1001:编译器中发生内部错误
c: ''program files(x86)'' microsoft visual studio 9.0''vc''include''msclr''amarshal.h 49 1 win32project
该代码是在Visual Studio 10中编译的,其中使用的是Framework 3.5,而不是4.0
我检查了发生内部编译的行,错误发生在封送.h文件中的第49行:
_size = ::WideCharToMultiByte(CP_THREAD_ACP, WC_NO_BEST_FIT_CHARS, _pinned_ptr, _str->Length, NULL, 0, NULL,NULL);
if (_size == 0 && _str->Length != 0)
{
throw gcnew System::ArgumentException(_EXCEPTION_WC2MB);
}
我想发生这个错误是因为c++代码中的String::String^
输入参数没有被封送至c#代码,或者相反。
我不确定我需要什么来修复代码的c++端或代码的c#端。知道吗?
我想可以制作一个c++dll,让c库导入该库并调用c++dll中的一个方法,然后让win32应用程序加载c++dll,但当c++dll使用c库作为引用时,让库加载w++dll似乎很奇怪。
我检查了发生内部编译的行,错误发生在这里封送.h文件中的第49行。
_size = ::WideCharToMultiByte(CP_THREAD_ACP,
WC_NO_BEST_FIT_CHARS,
_pinned_ptr,
_str->Length,
NULL, .
0,
NULL,
NULL);
if (_size == 0 && _str->Length != 0)
{
throw gcnew System::ArgumentException(_EXCEPTION_WC2MB);
}
我想发生这个错误是因为c++代码中的String::String^输入参数没有被整理到c#代码中,或者相反。不确定id我需要修复代码的c++isde或代码的c#端。
如果是本机C++函数,请使用Marshal.GetDelegateForFunctionPointer
如果您使用的是C++/CLI,听起来像(您应该重新标记这个问题),那么您需要的内容如下:
NetSocket(gcnew Action<int,int,String^>(this, &ServerClass::ActionMethod))