3

C++ .net アプリケーションで定期的に使用する関数のグループを含む DLL を作成しようとしています。これらの関数は特定のオブジェクトを参照しないため、名前空間に配置するのが最善の方法だと思います。

namespace MyNamespace
{
    int a();
    int b();
    int c();
}

DLL は正しくコンパイルされますが、クライアント ソリューションで名前空間を使用しようとすると、次のエラーが発生します。

error C2871: 'MyNamespace' : a namespace with this name does not exist

ただし、関数をクラス内の静的メソッドとしてラップすると、クライアント ソリューションは期待どおりにコンパイルおよび実行されます。

namespace MyNamespace
{
    public ref class MyClass
    {
    public:
        static int a();
        static int b();
        static int c();
    }
}

私の推測では、ref キーワードがクラスに対して何らかの処理を行って、クラスをクライアント アプリケーションに公開していると考えられます。クラスの代わりに名前空間を使用してマネージド/CRL/CLI/.net .DLL を作成するにはどうすればよいですか?

4

2 に答える 2

1

内のパブリック メソッドだけpublic ref classが、他のマネージ コードで表示および使用できます。最初の宣言は、そのようなクラス内にない関数を作成しました。これは一般に CLR ではサポートされていません。メソッドはクラス内に存在する必要があります。

C++/CLI コンパイラは、C++ コードでそのような関数を使用するのが一般的であるため、コードをコンパイルします。ただし、関数内のコードに適したホームを見つける必要があり、そのホームとなる特別なクラスを作成します。という名前<Module>で、生成されたアセンブリで ildasm.exe を実行すると表示されます。このクラスには意図的に使用できない名前が付けられており、識別子に山かっこを使用できません。また、内部としてマークされているため、メタデータ ブラウザにも表示されません。関数をリンクすることはできます。つまり、他の C++/CLI ソース コード ファイルから関数を呼び出すことができます。しかし、他のマネージ言語からではなく、リンカーを使用しません。

したがって、見つけた回避策を使用してください。これは、関数を公開するための優れた方法です。

于 2013-06-12T11:55:38.570 に答える
0

できません。.NET には、「無料」の機能はありません。すべてがクラスのメソッドです。あなたの場合、静的クラスの静的メソッドですが、それでもクラスのメソッドです。

于 2013-06-12T08:58:22.760 に答える