簡體   English   中英

導入.net類型庫時編譯錯誤

[英]Compilation error when importing .net type library

我正在嘗試在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):nullability說明符'_Nullable'不能應用於非指針類型'int':

typedef _Nullable Nullable;

[bcc32c錯誤] mscorlib_TLB.h(12060):匿名結構的聲明必須是一個定義:

interface _Nullable  : public IDispatch

[bcc32c錯誤] mscorlib_TLB.h(22823):expect')'mscorlib_TLB.h(22822):匹配這個'(':

  virtual HRESULT STDMETHODCALLTYPE MarshaledObject(VARIANT obj/*[in]*/, 
                                                    Mscorlib_tlb::_ObjRef* or/*[in]*/) = 0; // [-1]

我也嘗試使用'Import .NET Assembly'導入.net dll,但這給了'OLE Error'。

知道我錯過了什么嗎?

編輯:

我編寫了自己的類庫(我之前從未使用過C#,我希望我可以在沒有它的情況下在C ++ Builder中使用.NET dll)並嘗試將其導入C ++ Builder。 但是我在(在C ++ Builder中)生成的mscorlib_TLB.h中得到了完全相同的錯誤。 但是這個庫,我可以使用選擇'Import .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。

我也遇到過這個問題。

問題是mscorlib有一個Nullable接口,在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文檔中編輯該文件。

我還發現我需要為未編寫的C#類編寫干凈的C#包裝器。 一個例子是Crystal Reports。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM