如何使用Action委托参数方法将win32应用程序中的c ++方法的地址传递给ac#方法

我有一个使用C#库win32应用程序。

C#库有一个方法,其中Action委托是一个参数,如下所示:

 public NetSocket(Action 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 action)

是否需要使用一些封送方法来将win32代码中使用的System::String与C#代码中使用的System::String进行匹配? 我传递System::String错误还是必须要做其他事情? 我必须做什么来将System::String^ message参数与string参数匹配?
谢谢


纠正我尝试了你的解决方案,它给出了以下错误:

1错误C3352: 'void ServerClass::ActionMethod(int,int,System::String ^)' :指定的函数与委托类型'void (void)'不匹配


@Ben:越来越近了。 现在当我使用你的解决方案编译代码时,我得到一个内部编译错误,如下所示:

错误C1001:编译器中发生内部错误。
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, 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,但是让一个库加载一个w ++似乎很奇怪dll当c ++ dll使用c#库作为参考时。


我检查了内部编译发生的行,错误发生在marshal.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(this, &ServerClass::ActionMethod))