导入.net类型库时出现编译错误

时间:2019-03-21 12:10:40

标签: .net dll c++builder

我正在尝试在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。

1 个答案:

答案 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。