1

Managed C++ DLL でコンパイル時に計算される const int があります。この値を呼び出す C# プログラム内の属性で、この値を使用する必要があります。最初に const int 値を返す静的メソッドを作成しましたが、C# はこれをコンパイル時の const として認識しません。また、DLL名前空間内でconst intとして宣言しようとしました

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

C# から MyNameSpace.AttributeConstValue にアクセスしようとすると、「名前空間 MyNameSpace に存在しません」が返される

const を C# に渡して const 式として認識させる方法はありますか?

4

3 に答える 3

2

C++/CLIリテラルキーワードを使用して、他のマネージ コンパイラから見えるパブリック定数を宣言する必要があります。また、ref クラス内に表示する必要があります。このような:

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

C# の使用例:

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

かなり危険ですのでご注意ください。リテラル値は、C++/CLI アセンブリへの参照なしで C# アセンブリのメタデータにコンパイルされます。したがって、この宣言を変更しても C# プロジェクトを再コンパイルしないと、厄介なミスマッチが発生します。しかし、属性宣言でそれを使用する必要がある限り、これに対する修正はありません。

于 2012-06-26T21:31:24.423 に答える
0

Const他の宣言とは異なります。コードのコンパイルが開始されると、値を変更できなかっconstたため、コンパイラは を使用するすべての場所をその値に置き換えます。constコンパイル時に一度解決され、そのまま残ります。よく覚えていませんが、最適化フラグconstはコードから宣言を削除することさえあると思います。したがって、状況は次のようになります。コンパイルが完了したら、それを変更することはできません-したがって、最初に試みます-何らかの関数でそれを返すか、ゲッター/セッターが正しいものです。明らかに、それを変数に返すことはできません.to const-return-itはプログラムをコンパイルする必要があり、プログラムをコンパイルするときに...ポイントを取得します:)

PS C++については知りませんが、C#では const はclassメンバーであり、宣言できませんでしたnamespace

于 2012-06-26T21:19:03.120 に答える
0

ここに答えが見つかりまし

// 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# 属性のフィールド値として参照することは、この手法を使用して正常に機能します。値は、コンパイル時の定数式と見なされます。

于 2012-06-26T21:20:33.577 に答える