11

Visual Studio 2010 pro/C# プロジェクトで、Robert Giesecke による拡張機能「Unmanaged Exports」を使用しようとしています。それでも、私はそれを機能させることができません - エクスポート用にコンパイルされた DLL をチェックすると、ビューアー ( http://www.nirsoft.net/utils/dll_export_viewer.html ) は常に空になり、エクスポートが定義されていないようです全て。

例をほとんどコピーして、ビルド/構成マネージャー/アクティブ プラットフォームを x86 に設定しました。すべての魔法を実行する MSBuild タスクが実際に実行されているかどうかを何らかの方法で確認できますか? プロジェクト ファイルには何を含める必要がありますか (疑わしいほど空に見えますか?)

4

2 に答える 2

25

サポートを提供しない作成者による文書化されていないハックに頼るのではなく、文書化された方法でこれを行うことをお勧めします。例でやってみましょう:

namespace Publics {
    public class Class1 {
        public static void Run() { 
            // Stuff...
        }
    }
}

プロジェクトに新しい C++/CLI クラス ライブラリを追加します。ソリューションを右クリックし、[追加]、[新しいプロジェクト] の順にクリックします。[その他の言語] ノード、Visual C++、CLR を開き、[クラス ライブラリ] プロジェクト テンプレートを選択します。新しいプロジェクト、[プロパティ]、[共通プロパティ]、[フレームワークおよび参照] を右クリックし、[新しい参照の追加] ボタンをクリックします。[プロジェクト] タブから、メソッドをエクスポートする C# プロジェクトを選択します。

//TODO コメントで事前生成された空のクラスを削除し、次のようなコードを記述します。

extern "C" __declspec(dllexport)
void __stdcall Example() 
{
    Publics::Class1::Run();
}

ソリューションを構築します。DLL で dumpbin.exe /exports を実行して、Example 関数がエクスポートされたことを確認します。次のようなものが表示されます。

      1    0 00001020 _Example@0 = _Example@0

名前と呼び出し規約以外にも、エクスポートされた関数を微調整するための選択肢がたくさんあります。静的メソッドの代わりにインスタンス メソッドをエクスポートする場合は、たとえば次のように関数を記述できます。

extern "C" __declspec(dllexport)
void __stdcall Example() 
{
    Publics::Class1^ obj = gcnew Publics::Class1;
    obj->Run();
}

これを複雑にするには、C++/CLI 言語にある程度精通している必要があります。大事なことを言い忘れましたが、Giesecke の IL リライタを機能させようとした最初の試みで何が問題だったのかを知ることもできます。それ以外の場合は、C++/CLI コンパイラがマネージ メソッドをエクスポートするために使用する手法とまったく同じ手法を使用します。

于 2013-06-16T09:23:16.640 に答える