1

次の方法でアセンブリを appdomain に読み込みます。

            var appdomainSetup = new AppDomainSetup();
            //string appBase = Environment.CurrentDirectory;
            //string appBase = HttpContext.Current.Request.ApplicationPath;
            appdomainSetup.ApplicationBase = _appBase;//System.Web.HttpContext.Current.Request.ApplicationPath: Injected into cstor
            System.Diagnostics.Debug.WriteLine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase);
            appdomainSetup.DisallowBindingRedirects = false;
            appdomainSetup.DisallowCodeDownload = true;
            appdomainSetup.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

            appDomain = AppDomain.CreateDomain("myAppdomain", null, appdomainSetup);

どこBLASSEMBLYLOCATION = "c:\path\myAssembly.dll";//for now just hard coded path

次に、別のメソッドでこのアセンブリから型を取得します。

var helperObject= appDomain.CreateInstanceAndUnwrap("myssembly.NameContinued", "myNamespace.BL.Helper") as Helper;//ERROR LINE HERE

これはすべて、単体テストでうまく機能します。ただし、Web アプリケーションを介して実行すると、これはエラーで爆発します。

ファイルまたはアセンブリ 'myssembly.NameContinued' またはその依存関係の 1 つを読み込めませんでした。

FileNotFoundException指定しないことで単体テストで再現できます

appdomainSetup.ApplicationBase

この問題は、ApplicationBase として設定したディレクトリに関係していると思われます。Web プログラムでは、 と思われる値を渡しHttpContext.Current.Request.ApplicationPathます"/"

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

0

ApplicationPath を、アセンブリを配置したパスと同じに設定します。

appdomainSetup.ApplicationPath = @"c:\path";

このアセンブリは Web プロジェクトによって参照されるため、相対パスを使用できるように、アセンブリが Web プロジェクトと同じディレクトリに含まれることを期待していました (binフォルダーの作業と同様)。ただし、何らかの理由でこれは機能しません。サーバー上に存在するフルパスを指定することは、これまでのところ唯一の解決策です。

于 2013-03-29T19:35:23.253 に答える