有时候我们的C++代码需要调用C#写的DLL,这就带来一个问题,非托管程序如何调用托管DLL?
解决方法是:把C#写的DLL注册成COM组件,这样就可以非托管程序中调用了。详细操作步骤请见本图文教程。
下面以BCB或Embarcadero XE为例,展示具体步骤:
1,用C#编写DLL,本例中输出一个测试函数,DESMain.cs代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;
using System.IO.Compression;
using System.Xml;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Reflection;
using System.ComponentModel;
using System.Security.Cryptography;
using DES.Core;
namespace DES.Core
{
public interface IDESComClass
{
String GetTestMessage(string param1);
}
[ClassInterface(ClassInterfaceType.None)]
public class DESComClass : IDESComClass
{
public String GetTestMessage(string param1)
{
return ("成功调用了动态链接!");
}
}
}
2,编译成COM Visible,生成TLB文件
3,用regasm注册
因为我们C#编写的DLL是32位的,所以请使用32位的.NET Framework下的Regasm.exe进行注册。也就是说Regasm是分64和32位,请根据自己的程式选用相应版本。
在本机中32位的regasm.exe所在的目录为:C:\Windows\Microsoft.NET\Framework\v4.0.30319
regasm DESComClass.dll
4,在BCB(Borland C++Builder)或Embarcadero XE中导入TLB
步骤如图所示:
经过这些步骤之后,就可以把新产生的DESComClass_TLB.cpp和DESComClass_TLB.h加入工程了。产生的mscorlib_TLB.cpp和mscorlib_TLB.h一般用不到,可以不放入工程。
5,使用DLL中的输出函数
对于加入的COM类,应该怎样调用呢?先引用该tlb的头文件,然后以调用C#DLL中的函数为例,让这个函数输出的文字显示在Etit3上,可以这样调用:
AnsiString s_in,s_out;
::CoInitialize(NULL);
IDESComClass* pUnk = 0;
CoCreateInstance(CLSID_DESComClass_, 0, CLSCTX_ALL, __uuidof(IDESComClass), (void**)&pUnk);
s_out = pUnk->GetTestMessage(WideString(s_in).c_bstr());
::CoUninitialize();
Edit3->Text = s_out;
运行结果如下(ps.C#编写的COM组件的dll应放在测试程式所在目录):
OK
其他参考文章:点击打开链接