1

C# .NET Framework 2.0 を使用して DLL を作成しようとしています。すべて正常にコンパイルされますが、アプリケーションから DLL にアクセスしようとすると、プロシージャ アドレスを取得しようとすると失敗します。そこで、Dependency Walker で DLL を操作しましたが、すべてのパブリック関数が見つかりません!

これまでのところ、私の DLL はかなり単純です。

namespace MyDll_Namespace
{
    public class MyDllClass
    {
        public static int Func1( /* params */ ) { /* ... */ }

        public static int Func2( /* params */ ) { /* ... */ }

        public static int Func3( /* params */ ) { /* ... */ }

        public static int Func4( /* params */ ) { /* ... */ }
    }
}

名前空間のクラス外だけでなく、クラス内でも定義されているいくつかの定数とデリゲートだけです。ご意見やご提案をいただければ幸いです。ありがとう。

4

5 に答える 5

2

Dependency Walker は、.NET アセンブリ (マネージ コード) ではなく、win32 DLL (ネイティブ コード) 用です。任意のクラスのメソッドは見つかりません (静的であっても)。ネイティブ コードからマネージ コードを呼び出す必要がある場合、それを行う方法はいくつかありますが、きれいではありません

マネージ コードから dll を使用する場合は、はるかに簡単です。System.AssemblyActivatorを確認してください。

この例:

var assembly = Assembly.LoadFile(@"\path\to\your.dll");
var mydllclass_type = assembly.GetType("MyDllClass");
var instance = Activator.CreateInstance(mydllclass_type);

インスタンスはオブジェクトになります。メソッドを呼び出すには、リフレクションを使用する必要があります。これは、インターフェイスがコンパイル時に認識されないためです。

プラグイン システムを作成している場合、最善の方法は、すべてのプラグインに共通のインターフェイスまたは抽象ベースを用意し、それをプログラムで参照することです。プラグインを実装するサード パーティも、このコントラクトを参照します。この場合、最後の行が少し変わります。

var instance = (IMyDllClass)Activator.CreateInstance(mydllclass_type);

これで、定期的に構築されたオブジェクトのようにメソッドを使用できます。

于 2010-10-25T17:13:15.397 に答える
0

ここでの問題の一部は、Dependency Walker がネイティブ アプリケーション用のツールであることです。マネージド コードを認識しないため、定義したマネージド型 + メソッドは表示されません。

あなたの質問のこの行に混乱しています

アプリケーションから DLL にアクセスしようとすると、プロシージャ アドレスを取得しようとすると失敗します

これは、マネージ アプリケーションではなく、ネイティブ アプリケーションで見られるエラーのように思えます。ネイティブ アプリケーションから C# コードにアクセスしようとしていますか? その場合、これは直接呼び出しではなく、COM マジックを介してのみ実行できます。ここで何が起こっているのか、もっと詳しく説明していただけますか?

于 2010-10-25T17:14:41.927 に答える
0

.net Reflector を試して、ビルドされた DLL の内容を正確に確認してください (すべてが想定どおりであることを確認するため)。また、DLL を参照する前にビルド中にリリース モードになっていることを確認してください。何かが変わるかどうかはわかりませんが、試してみる価値はあります =)

于 2010-10-25T17:16:50.547 に答える
0

dll への参照を追加する必要があり、ランタイムは自動的に関数の呼び出しを許可します。これは、.net クラス ライブラリの作成に関する簡単なチュートリアルです。

于 2010-10-25T17:16:53.387 に答える