无法加载类型 Microsoft.VisualBasic.Information

Could Not Load Type Microsoft.VisualBasic.Information

提问人:user 提问时间:3/9/2018 最后编辑:user 更新时间:5/4/2023 访问量:5555

问:

我正在构建导入 .Net Framework 4.6.1 项目类库的 .Net Core 2.0 Web 应用程序。该解决方案构建正确,但是,当达到以下功能时,我收到此错误:

System.TypeLoadException: Could not load type 'Microsoft.VisualBasic.Information' from assembly 'Microsoft.VisualBasic, Version=10.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a

我在以下位置找到了Microsoft.VisualBasic.dll:C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.VisualBasic\v4.0_10.0.0.0__b03f5f7f11d50a3a

但是,在尝试添加引用并浏览引用时,引用不会保持选中状态。我可以检查它,但是当我返回到引用管理器时,DLL再次被取消选中。Project -> Add Reference

类库中的引用和导入的命名空间如下所示:Image 1

Image 2

Image 3

如果很重要,该功能使用反射,如下所示(在案例中显示导入):

    Imports System.Data.SqlClient
    Imports System.Reflection
    Imports Microsoft.Win32


    Shared Function GetContentCostFieldMapping(Optional ByVal busGrp As String = Nothing, Optional ByVal program As String = Nothing) As CostFieldMapping
        Dim _conn As SqlConnection = Nothing
        Dim _row As CostFieldMapping = New CostFieldMapping

        Try
            _conn = New SqlConnection(_sqlDB)
            _conn.Open()

            Dim _cmd As SqlCommand
            Dim _dr As SqlDataReader

            _cmd = New SqlCommand("GetContentCostFieldMapping", _conn)
            _cmd.CommandType = CommandType.StoredProcedure
            _cmd.Parameters.Add("@BusGrp", SqlDbType.NVarChar).Value = busGrp
            _cmd.Parameters.Add("@Program", SqlDbType.NVarChar).Value = program

            _dr = _cmd.ExecuteReader

            _row = SharedManager.GenericGet(Of CostFieldMapping)(_dr, False)
            Return _row
        Catch ex As Exception
            Helpers.LogMessage("Error: " + ex.Message + ". Stacktrace: " + ex.StackTrace)
        Finally
            If _conn IsNot Nothing AndAlso Not _conn.State = ConnectionState.Closed Then
                _conn.Close()
            End If
        End Try

        Return _row
    End Function

    Public Shared Function GenericGet(Of T As {Class, New})(dr As SqlDataReader, ByVal listFlag As Boolean)
        Dim results As Object
        If listFlag Then
            results = New List(Of T)()
        End If

        Dim businessEntityType As Type = GetType(T)
        Dim hashtable As New Hashtable()
        Dim properties As PropertyInfo() = businessEntityType.GetProperties()
        For Each info As PropertyInfo In properties
            hashtable(info.Name.ToUpper()) = info
        Next
        While dr.Read()
            Dim newObject As New T()
            For index As Integer = 0 To dr.FieldCount - 1
                Dim info As PropertyInfo = DirectCast(hashtable(dr.GetName(index).ToUpper()), PropertyInfo)
                If (info IsNot Nothing) AndAlso info.CanWrite AndAlso IsDBNull(dr.GetValue(index)) = False Then
                    SetValue(newObject, info, dr.GetValue(index))
                End If
            Next

            If listFlag Then
                results.Add(newObject)
            Else
                results = newObject
            End If
        End While
        dr.Close()
        Return results
    End Function

无法添加DLL是主要问题,但是,当我继续调试时,调试器不断抛出有关缺少库的错误。这两个项目不兼容吗?是否有一种干净的方法来导入 .NET Framework 代码库以在 .NET Core 应用程序中使用?

vb.net asp.net-core

评论

5赞 jmcilhinney 3/9/2018
.NET Core 实现 .NET Standard。是 .NET Standard 的一部分吗?无论如何,这种方法不应该在新的 VB.NET 代码中使用。自 .NET 问世以来,C# 开发人员一直在使用其他方法,它们也应该在 VB 中使用。IsDBNull
0赞 user 3/9/2018
感谢您的反馈。我不知道IsDBNull是不好的做法。删除它允许代码继续。是否有关于 .NET Standard 中不允许哪些功能的参考?
4赞 jmcilhinney 3/10/2018
这不是 .NET Standard 中不允许的情况,而是允许的情况。如果你想知道 .NET Standard 包含哪些内容,那么你可以阅读相关内容,但一个线索是,C# 中从未支持过的东西不会成为标准的一部分。这意味着任何特定于 VB 的内容,而不是语言本身的一部分,这几乎意味着 MsgBoxInStr' 和 .Microsoft.VisualBasic namespace, e.g. , IsDBNull
3赞 Maciej Los 5/13/2019
请看这里:ASP.NET Core (.NET Core) 和 ASP.NET Core (.NET Framework) 之间的区别。这可能有助于了解基于 Windows 的 (.net framework) 和多平台 (.net core) 项目之间的区别。
0赞 HardCode 6/24/2021
@jmcilhinney,C# 的 System.Convert 中似乎还有另一个 IsDBNull 函数,看起来它执行相同的操作。( learn.microsoft.com/en-us/dotnet/api/... )

答: 暂无答案