【问题标题】:The type 'Object' is defined in an assembly that is not referenced with .Net Core project“对象”类型是在 .Net Core 项目未引用的程序集中定义的
【发布时间】:2016-07-07 11:36:53
【问题描述】:

完整的错误是:

“对象”类型是在未引用的程序集中定义的。 您必须添加对程序集 'mscorlib, version=4.0.0.0, ...' 的引用

我尝试实例化仍在 .Net 4.5 程序集中的 MongoClient,如下所示:

var client = new MongoDB.Driver.MongoClient(@"mongodb://localhost:27017/");
if (client == null)
{
    return;
}

编译错误出现在client == null 行。

我的project.json如下:

{
  "version": "1.0.0-*",

  "dependencies": {
    "NETStandard.Library": "1.6.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
    "MongoDB.Driver": "2.2.4",
    "MongoDB.Driver.Core": "2.2.4",
    "MongoDB.Bson": "2.2.4"
  },

  "frameworks": {
    "netstandard1.6": {
      "imports": "net46"
    }
  }
}

我的虚拟机有 Win10 作为操作系统,所以我只安装了 .Net 46x。

我已经删除了 dnxcore50 的导入,并将其替换为完整的 net46 导入。我做错了吗?

【问题讨论】:

  • 你真的安装了.net core吗?
  • 是的。我可以构建和运行默认的 Mvc Asp.Net Core 模板。包还原也成功了。
  • 你的项目引用中有System吗?
  • System.Object 是 System.Runtime 的一部分,而 System.Runtime v4.1.0 是 NetStandard.Library 1.6 的一部分。所以是的,它应该被引用。但似乎 MongoDB.Driver 程序集中的 Object 引用和我的项目中的引用存在某种冲突。至少我是这么理解的。

标签: c# .net mongodb-.net-driver .net-core


【解决方案1】:

我通过删除 netstandard1.6 框架并用“net46”替换它来解决它。我的印象是,使用 netstandard1.6,我可以导入 .Net 4.6 框架并删除 dnxcore50 导入,然后它应该使用完整的库运行,如下所述:https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md#mapping-the-net-platform-standard-to-platforms

目前我已将我的项目更改为仅针对完整的 .Net 框架。 .Net Core Mongo 驱动程序可用后,我可以将其定位为 netcoreapp。

我的 project.json 现在是:

{
  "version": "1.0.0-*",

  "dependencies": {
    "NETStandard.Library": "1.6.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
    "MongoDB.Driver": "2.2.4",
    "MongoDB.Driver.Core": "2.2.4",
    "MongoDB.Bson": "2.2.4"
  },

  "frameworks": {
    "net46": { }
  }
}

感谢@Nick Acosta 指点我:A common class library consumed by both .NET Core and .Net 4.5.2

更新

我在 CoreFX Repo 上收到了 Eric Mellino 的回复:https://github.com/dotnet/corefx/issues/9885#issuecomment-231194545

您的第一个版本:

“框架”:{ “netstandard1.6”:{ “进口”:“net46” } }

基本上是在说:“为我构建一个针对 netstandard1.6 的库, 但也让我参考为 net46 构建的东西,即使它不是 兼容。”事实证明程序集不兼容,所以你 无法编译。问题是 MongoClient 引用了一个 驻留在 mscorlib.dll 中的 System.Object 类型。 NETStandard.App, 当以 netstandard1.6 为目标时,将引入一个 System.Runtime.dll,它引用了驻留的 System.Object 类型 在 System.Runtime.dll 中。没有 mscorlib 门面可以 调和这种差异,因此会出现编译错误。

如果您正在为 .NET Framework 构建,请使用您的第二种方法,即

“框架”:{“net46”:{},}。

如果你想为 .NET Core 构建,你需要一个版本 MongoClient 与 netstandard 兼容。这可能是 从 .NET Framework 应用程序中使用。

【讨论】:

    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 2016-09-04
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多