1

ウェブをしています。入力パラメーターによってアセンブリ ファイルをロードするサービス。次に、アセンブリで (特定のインターフェイスから継承された) 特定の型を見つけようとし、インスタンスを作成して、メソッドの結果を返します。

再度リリースされたアセンブリへの呼び出しを行う必要があります。

メソッドの入力パラメータから、web.config のアセンブリへのパスを見つけます。そして読み込んでみる。

これは機能するコードです:

[WebMethod]
    public String[] GetData(String confKey)
    {
        var assemblyPath = ConfigurationManager.AppSettings[confKey];
        var assembly = Assembly.LoadFrom(assemblyPath);

        List<String> retVals = new List<String>();

        foreach (var t in assembly.GetTypes())
        {
            if (t.ImplementsInterface(typeof(IMyServiceProvider)))
            {
                IMyServiceProvider objectInstance = Activator.CreateInstance(t) as IMyServiceProvider;
                retVals.Add(objectInstance.GetData());
            }
        }

        return retVals.ToArray();
    }

しかし、この方法では、ファイルが「ロック」されているため、ロードされたアセンブリを削除したり、置き換えたりすることができます。

そこで、別の方法でアセンブリを次のように独自の AppDomain にロードしようとしました。

[WebMethod]
    public String[] GetData(String confKey)
    {
        var assemblyPath = ConfigurationManager.AppSettings[confKey];

        var tmp = String.Concat("AppDomain", Guid.NewGuid().ToString("N"));
        AppDomain dom = AppDomain.CreateDomain(tmp, null, AppDomain.CurrentDomain.SetupInformation);
        AssemblyName assemblyName = new AssemblyName();
        assemblyName.CodeBase = assemblyPath;
        Assembly assembly = dom.Load(assemblyPath);

        List<String> retVals = new List<String>();

        foreach (var t in assembly.GetTypes())
        {
            if (t.ImplementsInterface(typeof(IMyServiceProvider)))
            {
                IMyServiceProvider objectInstance = Activator.CreateInstance(t) as IMyServiceProvider;
                retVals.Add(objectInstance.GetData());
            }
        }

        AppDomain.Unload(dom);
        return retVals.ToArray();
    }

しかし、このソリューションは例外がスローされます:

ファイルまたはアセンブリ 'NameOfMyAssembly' またはその依存関係の 1 つを読み込めませんでした。指定されたアセンブリ名またはコードベースが無効でした。(HRESULT からの例外: 0x80131047)- System.Reflection.AssemblyName.nInit(RuntimeAssembly& assembly, Boolean forIntrospection, Boolean raiseResolveEvent) で System.Reflection.RuntimeAssembly.CreateAssemblyName(String assemblyString, Boolean forIntrospection, RuntimeAssembly& assemblyFromResolveEvent) at System.Reflection.RuntimeAssembly .InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection) System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) at System.AppDomain.

最初のソリューション アセンブリが問題なくロードされ、2 番目のソリューション アセンブリがエラーをスローするのはなぜですか? ありがとう

4

1 に答える 1