我试图实现的是从我生成的 C# 类动态生成一个项目。此类的内容与实体框架的代码优先代码生成内容类似。内容如下所示:
namespace ElasticTables
{
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations.KeyAttribute;
[Table("address")]
public partial class address
{
[Key]
public decimal id { get; set; }
public string name { get; set; }
}
}
我从数据库中的表生成此文件,然后尝试以编程方式编译它,以便我可以在使用 API 的另一个项目中引用生成的项目。
编译时的主要错误是:
类型或命名空间名称"KeyAttribute"在命名空间"System.ComponentModel.DataAnnotations"中不存在(是否缺少程序集引用?
找不到类型或命名空间"密钥"
找不到类型或命名空间"表"。
我正在使用"CSharpCodeProvider"
var provider = new CSharpCodeProvider();
var options = new CompilerParameters
{
OutputAssembly = "ElasticTables.dll",
CompilerOptions = "/optimize"
};
我有以下引用的程序集
options.ReferencedAssemblies.Add(Directory.GetCurrentDirectory() + "\EntityFramework.dll");
options.ReferencedAssemblies.Add(Directory.GetCurrentDirectory() + "\EntityFramework.SqlServer.dll");
我有一个字符串数组,其中包含称为源的文件路径,我尝试使用以下行进行编译
CompilerResults results = provider.CompileAssemblyFromFile(options, sources);
非常感谢帮助。
您需要引用所有需要的程序集(如错误所述),因此您需要添加,我至少要说:
options.ReferencedAssemblies.Add("System.dll");
options.ReferencedAssemblies.Add("System.ComponentModel.DataAnnotations.dll");
可能需要其他
关于您问题中的评论,是的,您应该指定options.OutputAssembly
此外,在生成的代码中:
using System.ComponentModel.DataAnnotations.KeyAttribute;
KeyAttribute
不是命名空间,因此在编译时可能会出错。
我也会在命名空间之前获取usings
。这不是绝对需要的,也不是错误,但这是常见的做法(这样您就可以确定引用的程序集来自 global
命名空间,而不是您的类所在的命名空间的子级 [以防万一存在名称冲突])
您是否尝试添加对"System.dll"和"System.ComponentModel.DataAnnotations.dll"的引用(用于System.ComponentModel的东西)?(因为您可能确实缺少程序集引用)
options.ReferencedAssemblies.Add(
Path.Combine(
Directory.GetCurrentDirectory(),
"System.ComponentModel.DataAnnotations.dll"));