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#端。

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

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

如果您使用的是C++/CLI,听起来像(您应该重新标记这个问题),那么您需要的内容如下:

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