通常の AssemblyResolve の方法で通常のアプリケーションで解決した問題があります。つまり、次のようなイベントを作成します。
AppDomain.CurrentDomain.AssemblyResolve += EmbeddedAssemblyResolver;
EmbeddedAssemblyResolver は次のようになります
private static Assembly EmbeddedAssemblyResolver(object sender, ResolveEventArgs args)
{
String resourceName = Assembly.GetExecutingAssembly().FullName.Split(',').First() + "." + new AssemblyName(args.Name).Name + ".dll";
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
{
if (stream != null)
{
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
}
}
return null;
}
これは、アプリケーション内ですべてグルーヴィーに動作します。すべての dll をアプリケーションに埋め込み、ローダーでロードします。しかし、同じように動作させたいサービスには同じことが当てはまりません。イベント ログに記録されるのは FileNotFound 例外だけです。上記のコードを Program.cs の Main() メソッドで実行します。このメソッドは、実行するサービスをロードし、動的アセンブリにリンクしないこと以外にはほとんど何もしません。ここにコードがあります
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new ServiceLoader()
};
ServiceBase.Run(ServicesToRun);
}
リゾルバーがアプリケーションでは機能するのに、Windows サービスでは機能しない理由を知っている人はいますか?