如何使用Action委托参数方法将win32 app中的c方法的地址传递给c#方法

前端之家收集整理的这篇文章主要介绍了如何使用Action委托参数方法将win32 app中的c方法的地址传递给c#方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个使用C#库的win32应用程序.

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#代码中,反之亦然.

我不确定我需要修复代码的c方面或代码的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#端.

如果它是本机C函数,请使用 Marshal.GetDelegateForFunctionPointer

如果您正在使用C/C++LI,它听起来像(并且您应该重新提出问题),您需要的内容如下:

NetSocket(gcnew Action<int,String^>(this,&ServerClass::ActionMethod))

猜你在找的Windows相关文章