首页 > 解决方案 > CLR Host - 如何使用任意方法签名执行函数

问题描述

我有一个托管 C# 测试 DLL,我想从我的非托管 C++ 代码中调用它的函数。

问题是我找不到一个示例来说明如何从我的 c++ 代码中调用任意函数,我只能得到ICLRRuntimeHost::ExecuteInDefaultAppDomain工作,但这个函数确实使用了预定义的方法签名。

问题

我能够ShowMsg从我的 C# DLL 中执行该函数,但我不知道如何调用具有其他签名的方法而不是int(int). 有人可以帮我吗?

C++ 代码

// interface definitions of functions from c# dll
typedef int (*TestCallbackPtr)(std::wstring info, int value1, double value2);
typedef int (*TestFunctionPtr)(std::wstring string1, int int1, double double1, TestCallbackPtr callback);

// path of my c# dll
auto pathDll = L"..." 

void RunTest()
{
    ICLRMetaHost* clrMetaHost = NULL;
    ICLRRuntimeInfo* clrRuntimeInfo = NULL;
    ICLRRuntimeHost* clrRuntimeHost = NULL;
    
    // loading the data above is excluded for simplicity!
    // ... 
    
    // -------------
    // Test 1: run ShowMsg => WORKING
    // -------------
    
    DWORD pReturnValue;
    HRESULT result = clrRuntimeHost->ExecuteInDefaultAppDomain(pathDll, L"Test.Managed", L"ShowMsg", L"Hello from C++", &pReturnValue);
    
    // -------------
    // Test 2: run TestFunction
    // -------------
    
    TestCallbackPtr callback = [](std::wstring info, int value1, double value2) {
        return 21;
    };
    TestFunctionPtr function = NULL;
    
    // how to continue? how can I execute the function here and assign my local function pointer so that following will work:
    // (*function)(L"Test", 45, 1.23, callback);
}

C# 代码

namespace Test
{    
    public class Managed
    {
        public static int ShowMsg(string msg)
        {
            MessageBox.Show(msg);
            return 0;
        }

        public delegate int TestCallback([MarshalAs(UnmanagedType.LPWStr)] string info, int value1, double value2);

        public static int TestFunction(
            [MarshalAs(UnmanagedType.LPWStr)] string string1, 
            int int1,
            double double1,
            TestCallback callback)
        {
            string info = $"string1 = {string1} | int1 = {int1} | double1 = {double1}";
            int returnValue = callback(info, 5, 10.34);
            return returnValue;
        }
    }   
}

标签: c#c++clrclr-hosting

解决方案


推荐阅读