我正在尝试在C ++ Builder(10.3)中使用第三方.net dll。
我使用regasm.exe为dll创建一个.tlb文件。然后,我进入“导入类型库”并选择已注册的.tlb,然后选择安装到新软件包中。
构建软件包时,在生成的文件mscorlib_TLB.h中出现错误(我没有.net经验,但是我知道mscorlib是.net中的基类)。
以下是一些错误消息和源代码行:
[bcc32c错误] mscorlib_TLB.h(2321):匿名结构的声明必须是一个定义:
interface DECLSPEC_UUID("{84E7AC09-795A-3EA9-A36A-5B81EBAB0558}") _Nullable;
[bcc32c错误] mscorlib_TLB.h(2322):预期类型:
typedef TComInterface<_Nullable, &IID__Nullable> _NullablePtr;
[bcc32c错误] mscorlib_TLB.h(4426):C ++要求所有声明都使用类型说明符:
typedef _Nullable Nullable;
[bcc32c错误] mscorlib_TLB.h(4426):不能为空的说明符'_Nullable'不能应用于非指针类型'int':
typedef _Nullable Nullable;
[bcc32c错误] mscorlib_TLB.h(12060):匿名结构的声明必须是一个定义:
interface _Nullable : public IDispatch
[bcc32c错误] mscorlib_TLB.h(22823):预期为')' mscorlib_TLB.h(22822):匹配此'(':
virtual HRESULT STDMETHODCALLTYPE MarshaledObject(VARIANT obj/*[in]*/,
Mscorlib_tlb::_ObjRef* or/*[in]*/) = 0; // [-1]
我也尝试过使用“导入.NET程序集”导入.net dll,但这给了我“ OLE错误”。
知道我缺少什么吗?
编辑:
我编写了自己的类库(我以前从未使用过C#,我希望没有它,我可以在C ++ Builder中使用.NET dll),然后尝试将其导入C ++ Builder。但是对于生成的mscorlib_TLB.h(在C ++ Builder中),我得到完全相同的错误。不过,通过该库,我可以选择“导入.NET Assembly”来导入。
using System;
using System.Runtime.InteropServices;
namespace ClassLibraryTest
{
[ClassInterface(ClassInterfaceType.None)]
public class TestKlass
{
public int Funkt1(int x)
{
x = x + 1;
return x;
}
public int Funkt2(int x)
{
x = x + 2;
return x;
}
public string Funkt3(string str)
{
return "str:" + str;
}
}
}
我已经尝试过Atozed的Crosstalk工具,以便在C ++ Builder中使用.NET程序集。在那里,我可以导入.NET dll。但是只有我编写的库,所需的dll也给我错误。我现在的计划是用C#编写我自己的(干净)接口,用它与所需的dll对话并通过Crosstalk导入C ++ Builder。
答案 0 :(得分:0)
我也遇到了这个问题。
问题在于mscorlib具有一个可空接口,该接口在mscorlib_TLB.h文件中声明为_Nullable。 _Nullable也是C ++ 17类型说明符,因此编译器无法将其识别为定义。
至少在C ++ Builder 10.3.2版中对此有一个修复程序。如果使用10.3.2重新导入,将可以使用,并且如果不需要其他功能,则可以避免使用AtoZed工具。
Rad Studio的\ bin文件夹中有一个导入映射文件tlibimp.sym。 10.3.2将_Nullable映射到_ Nullable _,以免干扰C ++ 17语法。您可以在Embarcadero文档here中查看如何编辑该文件。
我还发现,我需要为并非为导入而编写的C#类编写干净的C#包装器。一个示例是Crystal Reports。