“DateTime”类型是在未引用的程序集中定义的?

时间:2016-05-09 20:23:12

标签: c# .net visual-studio-2015 dnx

  • 创建了一个新的Class Library (Package)项目
  • project.json更改为这样(添加了项目依赖项):

project.json

    { 
         "version": "1.0.0-*",
         "description": "WMI.ECM.PCMS.Services.Acomba Class Library",
         "authors": [ "WILL" ],
         "tags": [ "" ],
         "projectUrl": "",
         "licenseUrl": "",

         "dependencies": {
           "Acomba.SDK": "2.0.0",
           "WMI.ECM.Inventory.Models": "",
           "WMI.ECM.Inventory.Services": "",
           "WMI.ECM.Inventory.Services.Contracts": ""
      },

         "frameworks": {
             "dnx451": { },
             "dnxcore50": {
                "dependencies": {
                  "Microsoft.CSharp": "4.0.1-beta-23516",
                  "System.Collections": "4.0.11-beta-23516",
                  "System.Linq": "4.0.1-beta-23516",
                  "System.Runtime": "4.0.21-beta-23516",
                  "System.Threading": "4.0.11-beta-23516"
                }
             }
         }
     }
  • 编译解决方案,我收到此错误:
  

“DateTime”类型在未引用的程序集中定义。您必须添加对程序集'mscorlib,Version = 4.0.0.0,Culture = neutral,PunlicKeyToken = b77a5c561934e089'的引用。

  • 然而,我的其他项目也没有这个问题,这些项目也针对DNX451和DNXCORE50。另外,我还要提一下,根据此屏幕截图,mscorlib.dll实际上已在相关项目中引用Referenced assemblies

结果,我做了一些最终无能为力的搜索。

我试图在我的project.json中添加依赖项到dnx451 {},如下所示:

"dnx451": {
  "dependencies": {
    "Microsoft.CSharp": "",
    "System.Runtime": ""
    ...
  }
}

因为我记得在某个地方读过这样的解决方案,但它没有用。

虽然我找不到任何有用的解决方案来解决实际问题,但这似乎是一个常见的问题。

目前正在使用

  • Visual Studio Community 2015 - 版本14.0.25123.00更新2
  • .NET Framework 4.6.01055
  • ASP.NET MVC 6已安装
  • 用于Xunit DNX单元测试项目模板的SideWaffle
  • Visual C#2015

更新

它似乎是由我从VS CMD行使用此工具导入的COM库引起的:Tlbimp.exe (Type Library Importer)

简而言之,AcoSDK.dll是一个COM库,我使用上述工具导入它来创建一个.NET程序集,所有的COM类型都解析为.NET类型。

然后,我使用NuGet.exe创建了一个我通过私人Feed发布的包。

然后,我在"Acomba.SDK": "2.0.0" project.json中将我的项目中的包引用为public DateTime CreatedAt { get { return p.PrTimeModified; } }

每当我使用此包中的DateTime属性时,都会发生生成错误。例如,这会导致错误发生:

public DateTime CreatedAt { get { return new DateTime(); } }

这不是:

tlbimp.exe

.NET DateTime的COM类型是Date。但是,它应该被视为遵循createTunnelDropdown: function (element, data){ var tpl = _.template('<option value="<%= id %>"><%= name %></option>'); var sorted = _.sortBy(data, 'title'); _.each(sorted, function(obj) { element.append(tpl({"id": obj.id, "name": obj.title})); }); }, 命令行中提供的示例中的步骤的DateTime。

只有当我在属性中添加一个点时,才会看到DNXCORE50中不支持DateTime。除了它是原生DateTime,例如'new DateTime()'(see screenshot here)。

有关如何解决此问题的任何线索?

1 个答案:

答案 0 :(得分:1)

根据GitHub上报告的这个问题: Accessing mscorelib in DNX Core 5.0 #989 ,似乎Core CLR并不能很好地支持引用mscorlib.dll的COM类型。

此外,还有一个可用于解决此问题的软件包,它是: Microsoft.NETCore.Portable.Compatibility

简而言之,它所做的只是将引用mscorlib.dll的类型(如COM对象)重新映射到较新版本的System.Runtime和其他库,而这些库又引用了相应的DLL以获得正确的版本。

所以解决方法是在project.json中添加这个包,如下所示:

<强> project.json

"frameworks": {
  "dnx451": { },
  "dnxcore50": {
    "dependencies": {
      "Microsoft.CSharp": "4.0.1-beta-23516",
      "Microsoft.NETCore.Portable.Compatibility": "1.0.1-beta-23516",
      "System.Collections": "4.0.11-beta-23516",
      "System.Linq": "4.0.1-beta-23516",
      "System.Runtime": "4.0.21-beta-23516",
      "System.Threading" :  "4.0.11-beta-23516"
    }
  }
}

有关此软件包的更多详细信息,以及有关该问题的更多信息,我强烈建议您按照提供的链接进行操作,因为它们涵盖了更深入的信息。

最后,它解决了这个问题! =)