0

我想要实现的是从我生成的c#类动态生成项目。 这班的内容进行了代码的第一代码生成实体的类似内容framework.The内容如下所示:当从文件编译汇编时发现命名空间错误

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”

(是否缺少程序集引用?)

无法找到类型或名称空间'Key'

无法找到类型或名称空间'Table'。

我使用“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); 

非常感谢帮助。

+0

btw,在哪个目录下创建了程序集?我是否在'OutputAssembly'参数中指定它?谢谢。 –

回答

0

您需要引用所有需要的组件(如错误说),所以你需要添加,我起码说:

options.ReferencedAssemblies.Add("System.dll"); 
options.ReferencedAssemblies.Add("System.ComponentModel.DataAnnotations.dll"); 
可能需要

其他

关于在你的问题发表评论,是的,你应该指定options.OutputAssembly

此外,在生成的代码:

using System.ComponentModel.DataAnnotations.KeyAttribute; 

KeyAttribute不是一个命名空间,所以编译时可能会出错。

我也想拿 之前的的命名空间。这不是必须的,也不是错误,但是这是常见的做法(并且这种方式可以确保引用的程序集来自global名称空间,而不是类的名称空间的子类[以防万一名称冲突] )

+0

你的答案奏效了;我不知道这个程序集位于何处(它的目录),它可能位于.net框架文件夹中? –

+0

在GAC('全局程序集缓存'),通常为'%windir%\ Microsoft.NET \ assembly \ GAC_ [32 | 64]'中查找引用的程序集,除非指定完整路径。您可以阅读有关GAC的更多信息[在MSDN上](https://msdn.microsoft.com/en-us/library/yf1d93sz(v = vs.110).aspx)。 – Jcl

+0

感谢您的反馈:)。 –

0

您是否尝试过添加对“System.dll”和“System.ComponentModel.DataAnnotations.dll”(对于System.ComponentModel的东西)的引用? (因为你可能确实缺少组件参考)

options.ReferencedAssemblies.Add(
    Path.Combine(
    Directory.GetCurrentDirectory(), 
    "System.ComponentModel.DataAnnotations.dll")); 
+0

是的,我的答案可能不够漂亮! :-) – Jcl