我有一个应用程序,我在其中编译 C# 代码并在运行时启动输出。到目前为止一切都很顺利,但现在我正在尝试编译 WinForms 应用程序,但在引用程序集时遇到了麻烦。
WinForms 项目的整个项目文件夹都在我的应用程序中,因此我通过将 .csproj 文件作为 XML 文件读取来检索所有引用的程序集。所以我将引用程序集的名称作为字符串,例如:
System
Microsoft.CSharp
System.Drawing
System.Windows.Forms etc.
是否可以在运行时仅知道这些名称就加载这些程序集?我知道他们在我的系统上的位置路径,但应用程序也应该在其他人的机器上正确运行。
更新
编译如下:从类文件中以字符串格式检索类中的代码,这些代码都存储在一个数组中。然后将该数组传递给 CSharpCodeProvider 编译器。该应用程序仅使用控制台程序即可按预期工作,但是一旦有引用的程序集(例如在 WinForms 中),我当然也必须编译这些程序集。
所以我要做的是从项目中获取所有要编译的程序集,然后加载它们,这样执行时就不会丢失程序集错误。
我当前的代码是这样工作的:
var assemblies = AppDomain.CurrentDomain
.GetAssemblies()
.Where(a => !a.IsDynamic)
.Select(a => a.Location);
parameters.ReferencedAssemblies.AddRange(assemblies.ToArray()); //parameters is CompilerParameters
这可行,但不是很好的工作方式,因为它只是从我的 Visual Studio 中添加所有引用的程序集(这当然不适用于每台机器)。