1

C#を使用して開発しているシェルのアドオンシステムを作成しています。私はこれこれをフォローしました。アドオンをロードする関数は次のとおりです。

public void loadAppFromDLL(string assemblyFile)
{
    Assembly a = Assembly.Load(assemblyFile);
    Type app = a.GetType("App");
    MethodInfo loadMethod = app.GetMethod("load");
    object appInstance = Activator.CreateInstance(app);
    loadMethod.Invoke(appInstance, null);
}

アドオンは次のとおりです。

using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace App
{
    public class App
    {
        public void load()
        {
            MessageBox.Show("Application loaded successfully!");
        }
    }
}

アドオンをビルドするときは、シェルの実行可能ファイルと同じディレクトリに配置して、次のコマンドを呼び出します。

LoadExternalApp lea = new LoadExternalApp();
lea.loadAppFromDLL("SampleApp");

(LoadExternalAppにはDLLロード関数が含まれています)

シェルをデバッグしているときに、次のことに気づきました。

  1. アプリが起動しませんでした
  2. System.NullReferenceExceptionがありました

私は何を正しくしていないのですか?

4

1 に答える 1

2

これ:

Type app = a.GetType("App");

名前空間で修飾された名前が。の型を探していますApp

あなたのタイプはAppの名前空間で呼び出されるAppので、Assembly.GetTypeが返さnullれ、それからあなたはそれを逆参照しています。代わりに、次を使用する必要があります。

Type app = a.GetType("App.App");

ただし、そもそもクラスに名前空間と同じ名前を付けないでください。それを修正して、次のような結果になるようにします。

Type app = a.GetType("App.PlugIn");

GetTypeより適切に、より多くの情報で失敗するためには、 (または)がnullを返すかどうかを確認する必要がありGetMethodます。

さらに、.NETの命名規則に従う必要があります-PascalCaseでメソッドに名前を付けます。ああ、メソッドを呼び出すためにリフレクションに依存するのではなく、アドインの共通インターフェースを検討することをお勧めします。

于 2013-02-19T14:03:53.137 に答える