1

通常、dllの参照を追加してから、そのdll内のクラスにアクセスし、そのクラスのインスタンスを作成します。これで、埋め込みリソースとしてdllファイルをプロジェクトに含めることができました。今私の質問は、クラスにアクセスして、埋め込みリソースとして含まれているdllにあるクラスのインスタンスを作成するにはどうすればよいかということです。私はグーグルを検索し、埋め込まれたリソースとして別のdllの中に1つのdllを埋め込み、それを私のコードから呼び出すようなstackoverflowリンクを見つけました

のような埋め込みリソースとして含まれているdllにアクセスするために私がそこで見つけた命令

サードパーティのアセンブリをリソースとして埋め込んだら、アプリケーションの起動時に現在のドメインのAppDomain.AssemblyResolveイベントをサブスクライブするコードを追加します。このイベントは、CLRのFusionサブシステムが、有効なプロービング(ポリシー)に従ってアセンブリを見つけられない場合に発生します。AppDomain.AssemblyResolveのイベントハンドラーで、Assembly.GetManifestResourceStreamを使用してリソースをロードし、そのコンテンツをバイト配列として対応するAssembly.Loadオーバーロードにフィードします。以下は、そのような実装の1つがC#でどのように見えるかを示しています。

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
var resName = args.Name + ".dll";    
var thisAssembly = Assembly.GetExecutingAssembly();    
using (var input = thisAssembly.GetManifestResourceStream(resName))
{
    return input != null 
         ? Assembly.Load(StreamToBytes(input))
         : null;
}
};

ここで、StreamToBytesは次のように定義できます。

static byte[] StreamToBytes(Stream input) 
{
var capacity = input.CanSeek ? (int) input.Length : 0;
using (var output = new MemoryStream(capacity))
{
    int readLength;
    var buffer = new byte[4096];

    do
    {
        readLength = input.Read(buffer, 0, buffer.Length);
        output.Write(buffer, 0, readLength);
    }
    while (readLength != 0);

    return output.ToArray();
}
}

それがはっきりしないことはほとんどありませんでした。その人は言った

アプリケーションの起動中に現在のドメインのAppDomain.AssemblyResolveイベントをサブスクライブするコードを追加します。このイベントは、CLRのFusionサブシステムが、有効なプロービング(ポリシー)に従ってアセンブリを見つけられない場合に発生します。

CLRのFusionサブシステムが失敗するのは何ですか?どういう意味ですか?AssemblyResolveイベントが発生するとき。このコードをprogram.csファイルに入れる必要がありますか?

Assembly.Load()はアセンブリをメモリにロードするだけですが、そのdll内にclassedのインスタンスを作成する方法を示していませんか?

私の興味のあるポイントについて詳しく話し合ってください。ありがとう

4

1 に答える 1

1

CLRのFusionサブシステムが失敗するのは何ですか?どういう意味ですか?

この記事では、それについて詳しく説明します(特に、ビットのプロービング(フュージョン)の部分):

プロービングがアセンブリを見つけることができない場合、AppDomain.AssemblyResolveイベントがトリガーされ、ユーザーコードが独自のカスタムロードを実行できるようになります。他のすべてが失敗した場合、TypeLoadException(依存アセンブリに存在する型への参照が原因でロードプロセスが呼び出された場合)またはFileNotFoundException(ロードプロセスが手動で呼び出された場合)がスローされます。


Assembly.Load()はアセンブリをメモリにロードするだけですが、そのdll内にclassedのインスタンスを作成する方法を示していませんか?

SOの別の質問では、動的にロードされたアセンブリで型のインスタンスを作成する方法について説明しています。

于 2012-05-08T09:19:18.727 に答える