【发布时间】:2018-10-16 21:12:57
【问题描述】:
我正在尝试将旧版 ASP.net VB Webforms 项目转换为 ASP.net Core 2 API 项目。
不幸的是,有很多对用 VB.net 编写的程序集的引用,而我无权访问原始代码。 我可以添加对项目的引用,但是当我尝试调试项目时,它会一直运行,直到我使用程序集中的方法并收到错误:
TypeLoadException: Could not load type 'Microsoft.VisualBasic.DateAndTime' from assembly 'Microsoft.VisualBasic, Version=10.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
有许多变量传递给它,其中一个是 DateTime。
DateTime dateIn = new DateTime(2018, 5, 7);
DateTime dateOut = new DateTime(2018, 5, 20);
我创建了一个简单的 C# Web 表单项目,添加了程序集并以相同的方式引用了代码,它可以工作并返回正确的值,只是它不喜欢 .net core 2 环境。
我发现了其他类似的问题,但答案似乎并不相关: System.TypeLoadException Microsoft.VisualBasic ASP.NET Core 2
从哪里开始的想法?
更新 1
感谢 cmets 明确说明这应该如何工作。 我查看了@john 提到的将代码从 DLL 转换回某种形式的源代码的工具。不幸的是,我目前没有足够的时间(或者可能是技能)来重写大量不起作用的代码。
新问题/想法: 有没有办法可以将当前的 DLL 编译为某种 exe 或 com 对象,并在 .NET Core 层之外与它进行交互,并且只是在 OS 层上? (希望我的解释是正确的。我意识到这会破坏跨平台兼容性,但它可能会在短期内解决问题,帮助项目推出,然后可以花时间重写问题组装。)
【问题讨论】:
-
你是说你试图从 .NET Core 代码中引用一个 .NET Framework 程序集吗?你不应该那样做。
-
所以它是一个 ASP.NET Core 项目,但它是针对 .NET Core 还是 .NET Framework,因为它可能是。如果它是 .NET Core,那么基本上是 VB6 保留的
Microsoft.VisualBasic命名空间中的任何内容都将不可用,因为它不符合 .NET Standard。在这种情况下,您将需要将该 DLL 替换为不调用这些旧功能的 .NET Core 版本。多年来是否可以使用它们一直是争论的焦点,这里有一个例子说明为什么不可以。他们可能不会经常咬你,但一次还是太频繁了。 -
总是有这个,但我认为你仍然必须重新编译那个 Dll。并非所有方法都可用,因此您可能不走运。 nuget.org/packages/Microsoft.VisualBasic/10.3.0-rc1
-
@john - 我相信这就是我正在做的事情。在我开始使用 .NET Core 之前,我并不知道这个 .dll 程序集。有没有办法转换它,我的阅读表明我需要弄清楚如何将它转换为.Net Standard?我所拥有的只是这个包含一些业务逻辑的 dll,无法访问它的源代码。我可以创建某种包装器并将其编译出来以使用 .Net Core / .Net Standard 吗?
-
@Charlie .NET Standard 适用于可以从 .NET Core 和 .NET Framework 项目中引用的跨平台代码(类库)。 .NET Core 适用于跨平台项目。您不太可能将这个库包装起来,因为这样做需要您引用它,并且会阻止您的代码跨平台。有什么方法可以对它进行逆向工程(如果许可证允许)并将相关代码放入 .NET Core 或 .NET Standard 项目中?
标签: c# asp.net vb.net asp.net-web-api asp.net-core-2.0