C#库具有Action< T>的方法. delegate是一个参数,如下所示:
public NetSocket(Action<int,int,string> action)
我在win32应用程序中有一个ref类,其方法与Action委托签名相匹配.
我如何将此方法作为上面列出的NetSocket方法中的Action参数传递?
Ben你的解决方案似乎有效,但是在将win32应用程序中的action delegate方法的System:Sting ^输入参数与C#代码中的Action委托的String输入参数进行匹配时存在编译错误. c#代码中的Action委托使用String作为输入参数,win32代码中的Action委托方法尝试使用System :: String ^进行匹配以匹配它,但这不起作用.
// win 32 app –
void ServerClass::ActionMethod(int iCommand,int iClientIndex,System::String^ message)
// win32 app -server =
gcnew NetSockets::NetSocket(gcnew Action(this,&ServerClass::ActionMethod));
// csharp –
public NetSocket(Action<int,string> action)
是否需要使用一些封送方法来将win32代码中使用的System :: String与C#代码中使用的字符串进行匹配?我传递System :: String错误还是必须要做其他事情?我必须做什么来将System :: String ^ message参数与string参数匹配?
谢谢
1 error C3352:
'void ServerClass::ActionMethod(int,System::String ^)'
: the specified function does not match the delegate type'void (void)'
@Ben:越来越近了.现在当我使用你的解决方案编译代码时,我得到一个内部编译错误,如下所示:
error C1001: An internal error has occurred in the compiler.
c:\program files (x86)\microsoft visual studio 9.0\vc\include\msclr\marshal.h 49 1 win32project
代码在Visual Studio 10中编译,其中使用Framework 3.5而不是4.0
我检查了内部编译发生的行,并在此处发生错误
marshal.h文件中的第49行:
_size = ::WideCharToMultiByte(CP_THREAD_ACP,WC_NO_BEST_FIT_CHARS,_pinned_ptr,_str->Length,NULL,NULL); if (_size == 0 && _str->Length != 0) { throw gcnew System::ArgumentException(_EXCEPTION_WC2MB); }
我猜错误的发生是因为c代码中的String :: String ^输入参数可能没有被编组到c#代码中,反之亦然.
我想可以制作ac dll并让c#库导入库并在c dll中调用一个方法,然后让win32应用程序加载c dll,但是当一个库加载aw dll时似乎很奇怪c dll使用c#库作为参考.
我检查了内部编译发生的行,这里发生了错误
marshal.h文件中的第49行.
_size = ::WideCharToMultiByte(CP_THREAD_ACP,. 0,反之亦然.
不确定id我需要修复代码的c isde或代码的C#端.
Marshal.GetDelegateForFunctionPointer
如果您正在使用C/C++LI,它听起来像(并且您应该重新提出问题),您需要的内容如下:
NetSocket(gcnew Action<int,String^>(this,&ServerClass::ActionMethod))