2013-05-16 62 views
0

我有一個用C#代碼構建的Dll,並且由於某些需要,我想將它用於C++代碼。在C++中使用C#dll時出現C2380錯誤

經過長時間的搜索,我找到了一個解決方案,並使用RegASM.exe從我的abcd.dll文件創建了abcd.tlb。

此文件的導入後,

#import "D:\\..\\abcd.tlb" raw_interfaces_only 

當我建我的解決方案出現錯誤,

錯誤C2380:類型前面的 'Accepted_Bills'(構造函數返回類型,或非法重新定義當前類名?)d:.. \ abcd.tlh

當我搜索這個錯誤時,我開始知道一個結構,

struct __declspec(uuid("23dbd772-5aa8-3b5a-90a1-b19e4a052166")) 
Accepted_Bills 
{ 
    long Denomination; 
    __int64 Accepted_Bills; 
}; 

與其成員之一具有相同的名稱。這在C++中是不允許的。我正在使用Visual Studio 2010來編譯這個。

任何人都可以請幫我刪除這個錯誤。感謝提前了很多!

回答

2

最簡單的解決方案是更改接口託管端的聲明。更改結構或字段的名稱。

如果您不想這樣做,您需要在C++代碼中進行更改。例如:

struct __declspec(uuid("23dbd772-5aa8-3b5a-90a1-b19e4a052166")) 
Accepted_Bills 
{ 
    long Denomination; 
    __int64 _Accepted_Bills; 
}; 

您需要停止在每次構建時自動生成頭文件並切換到手動生成。

在我看來,由於您控制接口的兩側,更改C#代碼是迄今爲止最簡單的解決方案。

+0

Thanx David!但是這是在導入「abcd.tlb」時在.tlh文件中自動生成的結構。我無法更改變量的名稱,因爲每次運行我的解決方案時,編譯器都會生成.tlh文件。 – Stuti

+0

然後你必須停止自動生成它。 –

+0

你能幫忙解決這個問題嗎?我已經試圖通過這種方式尋找解決方案。但直到現在還找不到。 – Stuti

1

您是否需要Accepted_Bills類型?

You can tell VS to exclude it from your inport.

#import "D:\\..\\abcd.tlb" raw_interfaces_only exclude("Accepted_Bills") 

嘗試用其他導入選項進行實驗例如high_method_prefix("Prefix")或者auto_renamerename(...)

+0

是的,我需要那個結構。請告訴我一些其他解決方案。 – Stuti

相關問題