C ++通过ICLRRuntimeHost :: ExecuteInDefaultAppDomain与C#互操作

时间:2014-01-01 06:20:59

标签: c# c++ .net interop

我的应用程序主要由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());
        }
    }
}

0 个答案:

没有答案