AppDomain
を別のベースディレクトリで作成しました。ただし、現在実行中のアセンブリをベースディレクトリにコピーせずに、現在実行中のアセンブリを他のAppDomainにロードすることはできません。私はバイトからロードしようとしました。現在のアセンブリを別のAppDomainにロード
私がロードしようとすると、私は例外を取得しないが、私は使用しようとすると:
domain.DoCallBack(new CrossAppDomainDelegate(...
私が取得:
は、ファイルまたはアセンブリをロードできませんでした....... .... システムは、指定されたファイルを見つけることができません。
私のコードは次のとおりです。
private static void SaveAssemblies(Assembly ass, List<byte[]> assemblyByteList)
{
AssemblyName[] assNames = ass.GetReferencedAssemblies();
foreach (AssemblyName assName in assNames)
{
Assembly referedAss = Assembly.Load(assName);
if (!referedAss.GlobalAssemblyCache)
{
SaveAssemblies(referedAss, assemblyByteList);
}
}
byte[] rawAssembly = File.ReadAllBytes(ass.Location);
assemblyByteList.Add(rawAssembly);
}
public static AppDomain CreateAppDomain(string dir, string name)
{
AppDomainSetup domainSetup = new AppDomainSetup();
domainSetup.ApplicationBase = dir;
domainSetup.ApplicationName = Path.GetFileName(dir);
domainSetup.PrivateBinPath = Path.Combine(dir, "Libs");
AppDomain domain = AppDomain.CreateDomain(name, null, domainSetup);
//Load system assemblies needed for the module
List<byte[]> assemblyByteList = new List<byte[]>();
SaveAssemblies(Assembly.GetExecutingAssembly(), assemblyByteList);
foreach (byte[] rawAssembly in assemblyByteList)
domain.Load(rawAssembly);
domain.DoCallBack(new CrossAppDomainDelegate(SetupLogging));
return domain;
}
アップデート:
アセンブリが、私は出力に見れば、私はこの
「TaskExecuter.Terminal.vshostを参照してくださいロードされているようです。 (Managed(v4.0.30319)):ロードされた 'NLog' 'TaskExecuter.Terminal.vshost.exe'(Managed(v4.0.30319)):ロードされた 'TaskExecuter'、シンボルが読み込まれました。
が、私はまだ例外を取得...私は=この
System.IO.FileNotFoundExceptionは、未処理のメッセージだった理解していない ファイルまたはアセンブリをロードできませんでした「TaskExecuter、バージョン= 1.0.4244.31921、 カルチャ=ニュートラル、PublicKeyToken =ヌル 'またはその依存関係の1つ。 システムは、指定されたファイルを見つけることができません。ソース= mscorlib
ファイル名= TaskExecuter、バージョン= 1.0.4244.31921、文化=中立、 なPublicKeyToken = nullをFusionLog ====事前バインド状態情報=== LOG:ユーザー=ピーター-PC \ピーターLOG:表示名=アプリケーションディレクトリ= ファイル:/// C:/ ProgramData/TaskExecuter/TaskLib/uTorrentTasksログ: Private:= C: \ ProgramData \ TaskExecuter \ TaskLib \ uTorrentTasks \ Libs 呼び出しアセンブリ:(不明)。 === LOG:このバインドは、デフォルトのロードコンテキストで開始します。ログ: アプリケーション構成ファイルを使用します。 2010 \ Projects \ TaskExecuter \ TaskExecuter.Terminal \ bin \ Release \ TaskExecuter.Terminal.vshost.exe.Config ログ:ホスト構成ファイルを使用します。 :LOG:マシン構成 C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ config \ machine.configのファイルを使用します。 LOG:現時点でポリシーが参照に適用されていません(プライベート、 カスタム、部分、または場所ベースのアセンブリバインド)。ログ:新しいURLの をダウンロードしようとしています ファイル:/// C:/ProgramData/TaskExecuter/TaskLib/uTorrentTasks/TaskExecuter.DLL。 ログ:新しいURLのダウンロードを試みています ファイル:/// C:/ProgramData/TaskExecuter/TaskLib/uTorrentTasks/TaskExecuter/TaskExecuter.DLL。 ログ:新しいURLのダウンロードを試みています ファイル:/// C:/ProgramData/TaskExecuter/TaskLib/uTorrentTasks/Libs/TaskExecuter.DLL。 ログ:新しいURLのダウンロードを試みています ファイル:/// C:/ProgramData/TaskExecuter/TaskLib/uTorrentTasks/Libs/TaskExecuter/TaskExecuter.DLL。 ログ:新しいURLのダウンロードを試みています ファイル:/// C:/ProgramData/TaskExecuter/TaskLib/uTorrentTasks/TaskExecuter.EXE。 ログ:新しいURLのダウンロードを試みています ファイル:/// C:/ProgramData/TaskExecuter/TaskLib/uTorrentTasks/TaskExecuter/TaskExecuter.EXE。 ログ:新しいURLのダウンロードを試みています ファイル:/// C:/ProgramData/TaskExecuter/TaskLib/uTorrentTasks/Libs/TaskExecuter.EXE。 ログ:新しいURLのダウンロードを試みています ファイル:/// C:/ProgramData/TaskExecuter/TaskLib/uTorrentTasks/Libs/TaskExecuter/TaskExecuter.EXE。のStackTrace:System.Reflection.RuntimeAssembly._nLoadで (のAssemblyName ファイル名、文字コードベース、証拠assemblySecurity、RuntimeAssembly locationHint、StackCrawlMark & stackMark、ブールthrowOnFileNotFound、 ブールforIntrospection、ブールsuppressSecurityChecks) するSystem.Reflectionました。 RuntimeAssembly.nLoad(のAssemblyName ファイル名、文字列のコードベース、証拠assemblySecurity、RuntimeAssembly locationHint、StackCrawlMark & stackMark、ブールthrowOnFileNotFound、 ブールforIntrospection、ブールsuppressSecurityChecks) System.Reflection.RuntimeAssembly.InternalLoad(文字列 assemblyString、証拠assemblySecurity、StackCrawlMark & stackMark、 でSystem.Reflection.RuntimeAssembly.InternalLoadAssemblyName(のAssemblyName assemblyRef、証拠assemblySecurity、StackCrawlMark & stackMark、 ブールforIntrospection、ブールsuppressSecurityChecks) でSystem.Reflection.Assembly.Load(文字列assemblyString) ブールforIntrospection) System.Runtime.Serialization.FormatterServices.LoadAssemblyFromString(文字列 のAssemblyName) System.Reflection.MemberInfoSerialiで でzationHolder..ctor dはTaskExecuter.AppDomainHelper.CreateAppDomain(文字列DIR、 文字列名)でSystem.AppDomain.DoCallBackで(SerializationInfoに 情報、StreamingContextコンテキスト) (CrossAppDomainDelegate callBackDelegate) :視覚的な\ \ユーザー\ピーター\ドキュメントプロジェクト\ TaskExecuter \ TaskExecuter \ TaskManagment \ Visual Studioの\ \ユーザー\ピーター\ドキュメント 2010: DでTaskExecuter.TaskManagment.TaskFinder.Probeでのライン50 ():プロジェクト\ TaskExecuter \ TaskExecuter \ AppDomainHelper.cs \スタジオ 2010 \ TaskFinder.cs:のd:\ users \ peter \ documents \ visual studioのTaskExecuter.TaskManagment.TaskManager.LoadTasks()の の Dでライン TaskExecuter.TaskManagment.TaskManager.Startで():プロジェクト\ TaskExecuter \ TaskExecuter \ TaskManagment \ TaskManager.cs \2010のVisual Studio \ \ユーザー\ピーター\ドキュメント 2010プロジェクト\ TaskExecuter \ TaskExecuter \ \ TaskManagment \ TaskManager.cs: d:\ users \ peter \ documents \ visualスタジオ 2010年\ Projects \ TaskExecuter \ TaskExecuter.Terminal \ ProgramにあるTaskExecuter.Terminal.Program.Main(String [] args)の の行。 .cs:行16 at System.AppDomain._nExecuteAssembly(RuntimeAssemblyアセンブリ、 String [] args) at System.AppDomain.ExecuteAssembly(String assemblyFile、 Evidence assemblySecurity、String [] args) ( )System.Threading.ThreadHelperのMicrosoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() にあります。ThreadStart_Context System.Threading.ExecutionContext.Runで(オブジェクト 状態) (のExecutionContext のExecutionContext、ContextCallbackコールバック、オブジェクト状態、ブール ignoreSyncCtx) System.Threading.ExecutionContext.Runで(のExecutionContext のExecutionContext、ContextCallbackコールバック、状態オブジェクト) System.Threading.ThreadHelper.ThreadStartで ()
のInnerException:
アセンブリを単純な「お尻」に短縮しないことが良い方法です。このように呼び出されないと、よりうまく動作する可能性があります。 –
@AlexeiLevenkov、あなたがアセンブリに関する情報を記録するためにstringbuilderを構築し始めるまで待ってください。その省略形で何を変数と呼ぶでしょうか? (pluginLog、domainLog、typeLog、___) – JoeBrockhaus