0

通常の 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 サービスでは機能しない理由を知っている人はいますか?

4

1 に答える 1

0

私はバカのようです。間違った dll を埋め込み、正しいものを埋め込みましたが、すべて動作します。

于 2013-03-28T11:11:35.293 に答える