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

4
  • 创建了一个新的类库(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
  • SideWaffle用于Xunit DNX单元测试项目模板
  • Visual C# 2015
更新 似乎是由我使用VS CMD行导入COM库引起的:Tlbimp.exe (类型库导入工具)
简而言之,AcoSDK.dll是一个COM库,我使用上述工具导入它来创建一个.NET程序集,其中所有COM类型都被解析为.NET类型。
然后,我使用NuGet.exe创建了一个包,并将其发布到我的私人Feed。

然后,在我的 project.json 文件中引用了包,如下所示:"Acomba.SDK": "2.0.0"

每当我使用该包中的 DateTime 属性时,就会出现构建错误。例如,以下情况会导致错误发生:

public DateTime CreatedAt { get { return p.PrTimeModified; } }

而这个不会:

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

.NET DateTime的COM类型是Date。但是,根据tlbimp.exe命令行提供的示例步骤,应该将其视为DateTime。
只有当我在属性后面添加了一个点时,我才发现DateTime在DNXCORE50中不受支持。但对于原生DateTime,如'new DateTime()'(请看这里的截图),则是支持的。
有什么方法可以解决这个问题吗?

你到底为什么要这样做呢?针对CoreCLR/CoreFx编程有助于让你的代码在将来能够运行在Linux或OSX上。而那个COM组件永远不会如此。 - Hans Passant
@HansPassant:为什么不呢?我的意思是,一旦封装在.NET导入类型程序集中,作为NuGet包发布,然后使用适当的兼容性包进行引用,有什么能阻止这个COM在其他操作系统上工作呢?此外,我还在学习过程中。=) - Will Marcouiller
1个回答

1
根据在GitHub上报告的问题:访问DNX Core 5.0中的mscorelib #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"
    }
  }
}

关于此软件包的更多详细信息以及了解问题的更多信息,我强烈建议您跟随提供的链接,因为它们涵盖了更深入的信息。

最终,它解决了问题!=)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接