我正在开发一个使用 Roslyn 进行 C# 代码运行时编译的系统。
我使用此代码添加程序集,将完全限定的程序集文件名传递给该方法。
public bool AddAssembly(string assemblyDll)
{
if (string.IsNullOrEmpty(assemblyDll)) return false;
var file = Path.GetFullPath(assemblyDll);
if (!File.Exists(file))
{
// check framework or dedicated runtime app folder
var path = Path.GetDirectoryName(typeof(object).Assembly.Location);
file = Path.Combine(path, assemblyDll);
if (!File.Exists(file))
return false;
}
if (References.Any(r => r.FilePath == file))
return true;
try
{
var reference = MetadataReference.CreateFromFile(file);
References.Add(reference);
}
catch
{
return false;
}
return true;
}
一切都运行良好,直到我想在代码中构建一个 Winforms 表单。 尽管将 System.Windows.Forms.dll 添加到程序集引用中,我仍然收到错误
命名空间“System.Windows”中不存在类型或命名空间名称“Forms”
阅读有关此错误消息的其他文章,所有解决方案都涉及 Visual Studio 并编辑
.csproj
文件以添加
<UseWindowsForms>true</UseWindowsForms>
那么,如何让 Roslyn 识别出我想要使用 Winforms 表单?
您不需要任何代码来加载程序集,除非您正在实现一种插件/附加架构。您所需要做的就是添加对您的项目的引用。
当您使用 Windows 窗体应用程序 (.NET Core) 模板创建项目时,您的 *.csproj 将如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
</Project>
你的参考资料是这样的:
而且您无需执行任何操作。另一方面,如果您从其他项目类型开始,您可能必须更改 *.csproj 并手动添加引用。