从.Net Core应用程序调用.Net Framework 4(或Mono)程序集

10
我有一个简单的 .Net Core 控制台应用程序,它引用了同一解决方案中的一个 .Net Framework 4.6.2 项目。当我构建时,我会收到以下错误提示:
error CS0012: 未引用定义在某个程序集中的类型 'Object'。您必须添加对程序集 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 的引用。
我在尝试做不被允许的事情吗?
是否有办法从 .Net Core 应用程序引用 .Net Framework 4.6(或 Mono)程序集(或使用 P/Invoke)?
使用 Visual Studio 2017,.Net Core 1.1。
2个回答

12
在 .NET Core 1.x 中,不允许引用 .NET Framework 4.6(或 Mono)程序集。.NET Core 1.x 和 .NET Framework 是两个不同的运行时,它们的类型不能混合 - 就像构建错误信息所说的那样。
相反,您可以重新编译 .NET Framework 4.6 程序集,以 ".NET Standard" 为目标。阅读更多关于 .NET Standard 的内容. 编译一个针对 .NET Standard 的库使该库能够在 .NET Framework、Mono 或 .NET Core 上运行。另一种选择是将 .NET Framework 4.6 程序集多目标化,这样它就会同时构建为 .NET Framework 4.6 和 .NET Core 1.1。只有当您的库所需的 API 不被 .NET Standard 支持时,才应该这样做。这与 @VMAtm 的答案大致相同,但您可以在 VS 2017 中使用单个 .csproj 来完成。

好消息是,你想要做的事情将会在 .NET Core 2.0 上得到支持,这个版本预计将于今年晚些时候发布(链接1)


2
您提供的链接中似乎没有提到如何从 .Net Core 引用 .Net Framework 的程序集。如果我有所遗漏,您能否具体指出来呢?此外,目前是否有任何方法可以从 .Net Core 应用程序 P/Invoke(或等效地)调用 .Net Framework 程序集(假设我只有 .Net Framework 程序集的二进制文件)? - Verax
2
上面的.NET Standard链接指向介绍net standard博客。在这篇文章中,“此兼容性桥接器提供了一个桥梁,使您能够将库转换为.NET Standard,而无需放弃引用尚未转换的现有库。” 不,没有办法在.NET Core 1.1上加载/运行该.NET Framework程序集,因为.NET Core 1.1中没有“兼容性桥梁”。 - Eric Erhardt
好消息是,你正在尝试的功能将在 .NET Core 2.0 上得到支持,该版本预计将于今年晚些时候发布。我没有看到路线图中声称这种能力将在2.0中添加。你能引用一下来源吗?编辑:没事了,我现在看到了。 - Verax
2
@Verax,Core 2.0是否解决了你的问题?我查看了路线图,但不清楚它是否声称在Core 2.0中包含了这种功能。你能指出来吗? - nam
3
@Verax,看起来即使在最新版本的.NET Core 2.2.1中你仍然无法做到,详情请见这里 - nam
显示剩余2条评论

2
.Net Core和.Net 4.0有不同的核心库。旧版.Net库中的类型System.Object定义在mscorlib中,显然没有被引用。
如果您确实引用了该库,您可能会遇到名称解析错误,因为相同的类型将在不同的库中以相同的命名空间和类型名称定义。所以是的,这是不允许的。
编辑:然而,有一种常见的方法称为“共享项目”,您可以在这里阅读相关信息。此外,这个问题对您可能有帮助:.net core classlibrary calling .net framework class library
另外,您可以尝试创建可移植类库,它可以从.Net Core和.Net 4.6库中引用。
可移植类库非常适合平台无关的公共代码以及可重复使用的库,在这些库中,平台特定的代码可以被分离出来。
编辑#2:正如@EricErhardt提到的那样,您可以使用不同的目标重新编译您的.Net 4.6库,但如果您没有源代码,则可能不是一个选项。

1
我并不是真的想分享代码(尽管我的测试可能暗示了这一点)。我想要从一个 .Net Core 应用程序中调用一个 .Net Framework 程序集。我仍在寻找这个问题的答案:是否有办法从 .Net Core 应用程序中引用 .Net Framework 4.6(或 Mono)程序集(或者通过 P/Invoke 调用它)? - Verax
你看到我链接的文章了吗? - VMAtm
是的,我当然看到了,他们的解决方案是共享代码,但这不是我感兴趣的。 - Verax

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