2

我们有一个使用 CSharpCodeProvider 动态生成和编译代码的应用程序。编译的代码使用 Entityframework,因此我们将 Entityframework.dll 的引用传递给编译器。我们随应用程序重新分发的 Entityframework.dll 是为 .net 4.0 构建的。我们还将对 System.ComponenModel.DataAnnotations.dll 的引用传递给编译器。这是对在 GAC 中找到的 dll 的引用。

在 .net 4.0 上运行应用程序时,所有这些都可以正常工作。但是,当在 .net 4.5 上运行时,我们会遇到一个问题,因为 .net 4.0 中的 Entityframework 中的一些属性已被移动到 .net 4.5 中的 System.ComponenModel.DataAnnotations 中。所以我们得到这样的错误:

消息=错误(CS0246):找不到类型或命名空间名称“列”(您是否缺少 using 指令或程序集引用?) - 文件:c:\Generated\DataContext\0rs2sztj.2.cs:14 错误(CS0433):“System.ComponentModel.DataAnnotations.Schema.ColumnAttribute”类型存在于“c:\Users\Steven Segers\AppData\Local\Temp\Temporary ASP.NET Files\vs\69fafaea\17b01629\assembly\dl3 \95fc97d4\5bdae37d_7c05d101\EntityFramework.DLL' 和 'c:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.ComponentModel.DataAnnotations\v4.0_4.0.0.0__31bf3856ad364e35\System.ComponentModel.DataAnnotations.dll' - 文件:c :\Generated\DataContext\0rs2sztj.2.cs:14

据我所知,有两种方法:

  1. 将 .net 4.0 的 System.ComponenModel.DataAnnotations 的参考程序集传递给编译器。这里的问题是这个参考程序集需要存在于目标机器上。为了适应这种情况,我们需要要求客户在他的服务器上安装 Windows SDK,或者将参考程序集与我们的应用程序一起分发。我发现前者是一个相当不受欢迎的要求,我不确定是否允许后者。
  2. 确保我们将面向运行时 .net 版本的 Entityframework.dll 传递给编译器。我不确定实现这一目标的最佳方法是什么。
4

0 回答 0