我的应用程序主要由Windows平台上的C ++开发。现在我想将C#实现的一些奇特功能集成到我的应用程序中。
我从C ++调用C#代码的方式是ICLRRuntimeHost::ExecuteInDefaultAppDomain,这要求C#的方法签名为static int pwzMethodName (String pwzArgument)
。
问题是如何将实例C ++类的指针作为pwzArgument传递给调用方法,并直接使用C#代码中的本机C ++类?
例如,我有以下C ++代码和C#代码,
// C++ code
struct IUserContext
{
virtual const char* GetCompany() const = 0;
virtual const char* GetUser() const = 0;
};
class UserContextImpl : public IUserContext
{
public:
virtual const char* GetCompany() const { return m_company.c_str(); }
virtual const char* GetUser() const { return m_user.c_str(); }
private:
std::string m_company; // will be assigned in constructor
std::string m_user;
};
int main()
{
ICLRRuntimeHost *pClrHost = CreateHost();
UserContextImpl user;
IUserContext& cx = user;
DWORD dwRet;
wstringstream param;
param << (void*)&cx;
pClrHost->ExecuteInDefaultAppDomain(
L"MySharpAssembly.dll",
L"MyCompany.Namespace.MyClass",
L"Start",
param.str().c_str(),
&dwRet);
//...
}
// C# code
namespace MyCompany.Namespace
{
interface IUserContext
{
string GetCompany();
string GetUser();
}
public class MyClass
{
public static int Start(string pwzArgument)
{
IntPtr pointer = (IntPtr)int.Parse(pwzArgument, NumberStyles.AllowHexSpecifier);
// How to implement this "MagicMarshal.GetInterface" method?
IUserContext cx = MagicMarshal.GetInterface<IUserContext>(pointer);
MessageBox.Show(cx.GetUser());
}
}
}