通常、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のインスタンスを作成する方法を示していませんか?
私の興味のあるポイントについて詳しく話し合ってください。ありがとう