Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将程序集从Roslyn编译加载到新的AppDomain_C#_.net Assembly_Roslyn - Fatal编程技术网

C# 将程序集从Roslyn编译加载到新的AppDomain

C# 将程序集从Roslyn编译加载到新的AppDomain,c#,.net-assembly,roslyn,C#,.net Assembly,Roslyn,我将从描述这个问题开始。所以我用Roslyn编译器动态创建一个.dll。稍后,我需要对其进行分析,以使用反射进行一些安全检查。 如果我使用以下代码: ... var assemblyStream = new MemoryStream(); compilation.Emit(assemblyStream); var assembly = Assembly.ReflectionOnlyLoad(assemblyStream.ToArray()); 它工作,但我无法卸载组件,因为这是不可能的这种方式

我将从描述这个问题开始。所以我用Roslyn编译器动态创建一个.dll。稍后,我需要对其进行分析,以使用反射进行一些安全检查。 如果我使用以下代码:

...
var assemblyStream = new MemoryStream();
compilation.Emit(assemblyStream);
var assembly = Assembly.ReflectionOnlyLoad(assemblyStream.ToArray());
它工作,但我无法卸载组件,因为这是不可能的这种方式。所以我发现我应该创建AppDomain,因为您可以卸载AppDomain和所有加载的程序集。现在我的代码如下所示:

...
var assemblyStream = new MemoryStream();
compilation.Emit(assemblyStream);
var temporaryAppDomain = AppDomain.CreateDomain("TemporaryAppDomain");
var assembly = temporaryAppDomain.Load(assemblyStream.ToArray());
...
AppDomain.Unload(temporaryAppDomain);
下面是一行:

var assembly=temporaryAppDomain.Load(assemblyStream.ToArray())

引发FileNotFoundException(无法加载文件或程序集…)


我错过了什么?如何将新程序集加载到临时AppDomain中?

这并不是对您问题的回答,但您为什么需要分析自己刚刚生成的代码?您不能确保只生成有效代码吗?如果不是,你就不能用Roslyn API来分析你的代码吗?@KrisVandermotten我不清楚。用户通过我们的网站上传.cs文件。我需要建立一个dll从它,所以我需要确保他们没有做任何讨厌的事情。我刚开始和roslyn一起分析它,因为我无法在上面工作,但在这种情况下,我想反射会越来越容易,越来越快。我不确定反射会越来越快。毕竟,它需要加载DLL,如果在已经使用roslyn编译的代码上使用roslyn API,则不需要加载DLL。第二,我不知道你说的“讨厌的东西”是什么意思,但与roslyn一起分析肯定比反思更有力。最后,它是否容易取决于之前的知识,这是旁观者的看法。对于roslyn来说,我将有多个语法树,并且必须多次“构建”语义模型。我现在很受鼓舞。我将尝试做一些基准测试:)您正在编译源代码,因此无论如何都需要构建语法树和语义模型。这不完全是对您问题的回答,但为什么您需要分析您自己生成的代码?您不能确保只生成有效代码吗?如果不是,你就不能用Roslyn API来分析你的代码吗?@KrisVandermotten我不清楚。用户通过我们的网站上传.cs文件。我需要建立一个dll从它,所以我需要确保他们没有做任何讨厌的事情。我刚开始和roslyn一起分析它,因为我无法在上面工作,但在这种情况下,我想反射会越来越容易,越来越快。我不确定反射会越来越快。毕竟,它需要加载DLL,如果在已经使用roslyn编译的代码上使用roslyn API,则不需要加载DLL。第二,我不知道你说的“讨厌的东西”是什么意思,但与roslyn一起分析肯定比反思更有力。最后,它是否容易取决于之前的知识,这是旁观者的看法。对于roslyn来说,我将有多个语法树,并且必须多次“构建”语义模型。我现在很受鼓舞。我将尝试做一些基准测试:)您正在编译源代码,因此无论如何都需要构建语法树和语义模型。