[英]Loading assembly compiled at runtime into different AppDomain fails
I try to load a DLL which was compiled at runtime into a different AppDomain. 我尝试将在运行时编译的DLL加载到其他AppDomain中。 This does not work while doing the same for system.dll works. 为system.dll进行相同操作时,这将不起作用。 This is my test code: 这是我的测试代码:
string sourceCode = "using System;\r\n" +
"[Serializable]\r\n" +
"public class Program1{\r\n" +
" public static void Main1(){\r\n" +
" int i = 100;\r\n" +
" i++;" +
" }\r\n" +
"}";
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
Assembly[] assembliesOfCurrentDomain = AppDomain.CurrentDomain.GetAssemblies();//this.CompilerResults.CompiledAssembly.GetReferencedAssemblies();
for (int runAssembliesInCurrDomain = 0; runAssembliesInCurrDomain < assembliesOfCurrentDomain.Length; runAssembliesInCurrDomain++)
{
try
{
parameters.ReferencedAssemblies.Add(assembliesOfCurrentDomain[runAssembliesInCurrDomain].Location);
}
catch
{
}
}
// True - memory generation, false - external file generation
parameters.GenerateInMemory = false;
parameters.OutputAssembly = "D:\\temp\\123.dll";
parameters.IncludeDebugInformation = true;
parameters.ReferencedAssemblies.Add(Assembly.GetEntryAssembly().Location);
// True - exe file generation, false - dll file generation
parameters.GenerateExecutable = false;
parameters.TreatWarningsAsErrors = true;
CompilerResults results = provider.CompileAssemblyFromSource(parameters, sourceCode);
Assembly own = Assembly.LoadFrom("D:\\temp\\123.dll");
Assembly system = Assembly.LoadWithPartialName("System");
AppDomainSetup appDomainSetup = new AppDomainSetup()
{
PrivateBinPath = @"D:\\temp"
};
AppDomain domain = AppDomain.CreateDomain("hello", AppDomain.CurrentDomain.Evidence, appDomainSetup);
domain.Load(system.GetName()); // works
AppDomain.CurrentDomain.Load(own.GetName()); // works
domain.Load(own.GetName()); // works not
I get a FileNotFoundException with the following "FusionLog" 我收到带有以下“ FusionLog”的FileNotFoundException
=== Zustandsinformationen vor Bindung ===
LOG: Benutzer = LIGHTTRANS2\schoening
LOG: DisplayName = 123, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
(Fully-specified)
LOG: Appbase = file:///D:/schoening/Projekte_VL/Testprojekte/Compileing/WindowsFormsApplication1/bin/x64/Debug/
LOG: Ursprünglicher PrivatePath = NULL
Aufruf von Assembly : (Unknown).
===
LOG: Diese Bindung startet im default-Load-Kontext.
LOG: Die Anwendungskonfigurationsdatei wird verwendet: D:\schoening\Projekte_VL\Testprojekte\Compileing\WindowsFormsApplication1\bin\x64\Debug\WindowsFormsApplication1.vshost.exe.config
LOG: Die Computerkonfigurationsdatei von C:\Windows\Microsoft.NET\Framework64\v2.0.50727\config\machine.config wird verwendet.
LOG: Die Richtlinie wird derzeit nicht auf den Verweis angewendet (private, benutzerdefinierte, teilweise oder pfadbasierte Assemblybindung)
LOG: Download von neuem URL file:///D:/schoening/Projekte_VL/Testprojekte/Compileing/WindowsFormsApplication1/bin/x64/Debug/123.DLL.
LOG: Download von neuem URL file:///D:/schoening/Projekte_VL/Testprojekte/Compileing/WindowsFormsApplication1/bin/x64/Debug/123/123.DLL.
LOG: Download von neuem URL file:///D:/schoening/Projekte_VL/Testprojekte/Compileing/WindowsFormsApplication1/bin/x64/Debug/123.EXE.
LOG: Download von neuem URL file:///D:/schoening/Projekte_VL/Testprojekte/Compileing/WindowsFormsApplication1/bin/x64/Debug/123/123.EXE.
Sorry that it is German, tomorrow I will try to post an English version. 抱歉,它是德语,明天我将尝试发布英语版本。 Any ideas what's the difference between the two assemblies? 任何想法这两个程序集之间有什么区别?
The compiling of the DLL works. DLL的编译工作。 I have the same problem if I comment out everything before the Assembly own = Assembly.LoadFrom("D:\\\\temp\\\\123.dll")
line and use the DLL compiled in the previous run. 如果我注释掉Assembly own = Assembly.LoadFrom("D:\\\\temp\\\\123.dll")
行之前的所有内容,并使用上次运行中编译的DLL, Assembly own = Assembly.LoadFrom("D:\\\\temp\\\\123.dll")
相同的问题。
Edit: Following a suggestion, I tried the following which does not work either. 编辑:根据建议,我尝试了以下两种方法也不起作用。
Assembly own = Assembly.LoadFrom("D:\\temp\\123.dll");
AppDomainSetup appDomainSetup = new AppDomainSetup() {
PrivateBinPath = @"D:\\temp"
};
//FileStream fs = own.GetFiles(true)[0]; // does not work either
FileStream fs = new FileStream("D:\\temp\\123.dll", FileMode.Open, FileAccess.Read, FileShare.Read);
byte[] rawAssembly = new byte[fs.Length];
fs.Read(rawAssembly, 0, (int)fs.Length);
AppDomain domain = AppDomain.CreateDomain("hello", AppDomain.CurrentDomain.Evidence, appDomainSetup);
domain.Load(rawAssembly);
The assembly name doesn't contain a full path to the assembly - the CLR doesn't have any way of finding your "temp" assembly. 程序集名称不包含该程序集的完整路径-CLR无法找到“临时”程序集。 If you want to load a specific assembly file into an AppDomain
, you'll have to use the byte[]
overload. 如果要将特定的程序集文件加载到AppDomain
,则必须使用byte[]
重载。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.