加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-13 20:26:55 所属栏目:Windows 来源:网络整理
导读:我有一个使用C#库的win32应用程序. C#库具有Action T的方法. delegate是一个参数,如下所示: public NetSocket(Actionint,int,string action) 我在win32应用程序中有一个ref类,其方法与Action委托签名相匹配. 我如何将此方法作为上面列出的NetSocket方法中的
我有一个使用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.0vcincludemsclrmarshal.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))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读