在运行时编译代码并使用加载在内存中的程序集。

3

我需要在运行时编译C#代码。我正在使用以下代码:

CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
parameters.ReferencedAssemblies.Add("MyLibrary.dll");    // File Path on Hard Drive
...

我希望您能够使用内存中加载的库,而不是它们的文件地址。这是否可能?

2
这是一个非常持久的谬论。“内存加载”是一种幻觉,当前的编译器(在您的情况下是csc.exe)在进程外运行,并在磁盘上读/写程序集。GenerateInMemory属性所做的就是强制调用Assembly.LoadFrom()。所以不要费心。 - Hans Passant
@HansPassant:是的,你说得对,谢谢。 - Ali Sepehri.Kh
1个回答

3

如果这是一个不仅在内存中生成的程序集,您可以使用以下方法:

parameters.ReferencedAssemblies.Add
( typeof(ClassInAssemblyYouWantToAdd).Assembly.Location
);

或者:

parameters.ReferencedAssemblies.Add
( Assembly.Load("Full.Qualified.Assembly.Name").Location
);

Location属性显示已加载程序集的路径。

它必须有程序集的硬拷贝,而不仅仅是内存中的内容,因此您不能只使用生成的程序集。如果需要使用它们,可以先将内存中生成的程序集保存到磁盘上。


@AliSepehri.Kh:有什么进展吗? - Patrick Hofman
1
这是错误的吗?你不能像帖子中解释的那样,只是将内存中的程序集放在那里。 - Patrick Hofman
1
不,但你可以先保存它。将compilerParams.OutputAssembly设置为文件路径。 - Patrick Hofman
我非常感激你,因为你的回答非常有用。 - Ali Sepehri.Kh
1
很遗憾。请参考汉斯的评论。我认为没有太多可以做的了。 - Patrick Hofman
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接