2012-06-26 14 views
1

我有一個const int,它是在我的託管C++ DLL中編譯時計算的。我需要在C#程序中調用它的屬性中使用此值。最初,我創建了一個返回const int值的靜態方法,但C#沒有將此視爲編譯時常量。我也試過宣佈它爲DLL命名空間內用const int如何將const int從託管C++ DLL傳遞到C#以用作屬性中的字段值

// C++ 
namespace MyNameSpace { 
    const int AttributeConstValue = 15 + sizeof(int); 
. . . 
} 

嘗試訪問從C#的回報「在命名空間myNameSpace對象不存在」

MyNameSpace.AttributeConstValue有沒有辦法通過一個常量來C#並讓它看作是一個const表達式?

回答

2

必須使用C++/CLI 文字關鍵字來聲明其他託管編譯器可見的公共常量。它必須出現在ref類中。就像這樣:

namespace Example { 
    public ref class Constants { 
    public: 
     literal int AttributeConstValue = 15 + sizeof(int); 
    }; 
} 

樣品C#用法:

[MyAttribute(Example.Constants.AttributeConstValue)] 
// etc.. 

當心,這是相當危險的。文字值會被編譯到C#程序集的元數據中,而不會引用您的C++/CLI程序集。因此,如果您對此聲明進行了更改,但不要重新編譯C#項目,那麼您將遇到令人討厭的不匹配問題。但只要你需要在屬性聲明中使用它,那麼就沒有解決這個問題。

+0

我們同時發佈相同的答案。 :) 謝謝! – JonN

+0

在我的情況下,C++ DLL項目和C#項目都是在C#項目的同一解決方案中構建的,具體取決於C++ DLL,從而減輕了不安全的情況。 – JonN

0

Const與其他聲明不同。當代碼開始編譯時 - 編譯器只是將所有使用const的地方替換爲它的值 - 因爲const的值無法更改。它已經解決了一次 - 在編譯時並保持這種狀態。我不記得,但我認爲優化標誌甚至刪除代碼的const聲明。所以情況是這樣的:當你編譯完成後,你不能改變它 - 所以你第一次嘗試 - 在某個函數中返回它,或者getter/setter是正確的。顯然你不能將它返回到const變量,因爲要返回它它必須編譯該程序,當你編譯該程序...你得到的重點:)

P.S.不知道C++,但在C#中const爲class成員,不能在namespace

+0

您錯過了我需要使用此常量作爲C#**屬性**中字段的值,並使用我的第一種技術C#編譯器抱怨說它不是常量表達式。看到我的答案爲此解決方案。這裏是C#的用法 [MarshalAs(UnmanagedType.ByValArray,SizeConst = MyNameSpace.ConstClass.AttributeConstValue] – JonN

+0

@JonN:'const'變量不是*常量表達式。編譯器需要一個'常量表達式',因爲它必須在編譯時有這個可用 –

+0

@Eds這是真的,但我不知道如何創建一個可用於C#的符號常量。使用** literal關鍵字,正如Hans指出的那樣,在託管的C++中,使AttributeConstValue成爲一個符號這是一個不變的表達。 – JonN

0

找到答案HERE

// C++ Const declaration 
namespace MyNameSpace { 
public ref class ConstClass { 
public: 
    literal int AttributeConstValue = 15 + sizeof(int); 
. . . 
} 

// C# Usage 
[MarshalAs(UnmanagedType.ByValArray, SizeConst=MyNameSpace.ConstClass.AttributeConstValue)] 
public byte [] results; 

引用MyNameSpace.ConstClass.AttributeConstValue爲C#屬性字段值工作正常使用此聲明技術。該值被視爲編譯時間常量表達式。

相關問題