我有一个使用RAD Studio (C ++ Builder)XE4开发的 C ++ Windows应用程序。它有一些插件,它们是动态加载this technique的DLL(总是用RAD Studio编写)。
现在在其中一个插件中我需要反射功能。虽然看起来我无法用C ++实现它们(我无法修改第三方COM DLL需要反射)我决定用C#重写这个插件(具有强大的反射功能),从而创建 .NET程序集。
我知道我应该通过COM公开程序集,但我不能(我们不想改变主应用程序加载所有DLL的方式)。
我的目标是动态加载.NET程序集并调用其函数(例如这里我们称之为SetParam
函数),类似于以下内容,就像我对其他插件一样
//load DLL
HINSTANCE handleDll = LoadLibraryW("C:/Path/to/the/assembly.dll");
//get reference to the function
void* ptr = GetProcAddress(handleDll, "_SetParam");
ptr_SetParam ptrFunc = reinterpret_cast<ptr_SetParam>(ptr);
//invoke function
int result = (*ptrFunc)(String("mykey").c_str(), String("myvalue").c_str());
其中ptr_SetParam
定义为
typedef int(*ptr_SetParam)(const wchar_t*, const wchar_t*);
有办法吗?
答案 0 :(得分:1)
感谢@ HansPassant的评论,我找到了一条路。
我创建了以下Visual Studio项目。
MyDllCore .NET程序集项目,用C#或任何其他.NET语言编写。在这里,我有我的托管类,如下所示,其中实现了程序集的真正逻辑。
using System;
using System.Collections.Generic;
//more usings...
namespace MyNamespace
{
public class HostDllB1
{
private Dictionary<string, string> Parameters = new Dictionary<string, string>();
public HostDllB1()
{
}
public int SetParam(string name, string value)
{
Parameters[name] = value;
return 1;
}
}
}
MyDllBridge DLL项目,用C ++ / CLI编写,带有/clr
编译器选项。它只是一个桥梁&#34;项目,它依赖于MyDllCore项目,只有一个.cpp o .h文件,如下所示,我将方法从加载DLL的程序映射到.NET程序集中的方法。
using namespace std;
using namespace System;
using namespace MyNamespace;
//more namespaces...
#pragma once
#define __dll__
#include <string.h>
#include <wchar.h>
#include "vcclr.h"
//more includes...
//References to the managed objects (mainly written in C#)
ref class ManagedGlobals
{
public:
static MyManagedClass^ m = gcnew MyManagedClass;
};
int SetParam(const wchar_t* name, const wchar_t* value)
{
return ManagedGlobals::m->SetParam(gcnew String(name), gcnew String(value));
}
最后我有一个 C ++ Builder程序加载MyDllBridge.dll并使用它的方法调用它们,如下所示。
//load DLL
HINSTANCE handleDll = LoadLibraryW("C:/Path/to/the/MyDllBridge.dll");
//get reference to the function
void* ptr = GetProcAddress(handleDll, "SetParam");
ptr_SetParam ptrFunc = reinterpret_cast<ptr_SetParam>(ptr);
//invoke function
int result = (*ptrFunc)(String("mykey").c_str(), String("myvalue").c_str());