1

私はこれを私のdllのメインクラスとして持っています:

namespace PTEmu
{

    public class DatabaseProtocol : IDatabaseProtocol
    {
      (constructors and methods)
    }
 }

DLL をロードし、クラスのインスタンスを作成するために使用するこのコード

var assembly = Assembly.LoadFrom("database\\" + file);
var t = assembly.GetType("PTEmu.DatabaseProtocol");
var protocol = Activator.CreateInstance(t) as IDatabaseProtocol;

Assembly.LoadFrom, assembly.GetTypeそれActivator.CreateInstance自体は、エラーをスローしません。

このコードは、問題なく動作する別のプロジェクトから取得したため、何が問題なのかわかりません。

を削除するas IDatabaseProtocolと、オブジェクトが返されますが、必要なインターフェイスのようなオブジェクトは返されないため、メソッドを簡単に呼び出すことができます...

4

2 に答える 2

6

これは型同一性の問題です。.NET での型の ID は、名前空間名と型名だけではありません。また、元のアセンブリも含まれます。したがって、ここでの間違いは、2 つの異なるインターフェイス タイプがあったことです。1 つはメイン アセンブリからのもので、もう 1 つはプラグイン アセンブリからのものです。[リンクの追加] を使用してソース コード ファイルを追加するだけでは十分ではありません。型がどのアセンブリにコンパイルされたかが重要です。つまり、ソース コード ファイルは、型の識別においてまったく役割を果たしません。

注目に値するのは、この規則が .NET 4 で変更されたことです。型の ID は、型に適用された [Guid] 属性の値によってのみ決定されます。これにより、アセンブリ参照のプロパティで「相互運用型の埋め込み」機能が有効になりました。No PIA 機能とも呼ばれます。ただし、COM インターフェイス タイプでのみ有効です。Office アプリを自動化するコードを作成するときに、大規模な PIA をインストールする必要がなくなりました。

ただし、インターフェイス タイプを定義し、両方のプロジェクトから参照される 3 番目のアセンブリである PIA とまったく同じことを行う必要があります。

于 2013-06-12T01:57:22.777 に答える