我正在使用 VB.Net DLL 并将其转换为可移植类库。一旦我把所有的类都移到了 PCL 的新项目中,Visual Studio 就开始为许多我认为仍然可以正常工作的常见 VB 语法抛出错误。一些例子:
- LCase
- InStr
- 剩下
- 中
- 错误转到 0
- 呃
是否有可能只有一些选项或包括我需要让这些工作?
我正在使用 VB.Net DLL 并将其转换为可移植类库。一旦我把所有的类都移到了 PCL 的新项目中,Visual Studio 就开始为许多我认为仍然可以正常工作的常见 VB 语法抛出错误。一些例子:
是否有可能只有一些选项或包括我需要让这些工作?
您必须使用可移植类库支持的程序集方法(请参阅程序集部分)。您将能够找到不适合您的方法的等价物(例如 = SubString、ToUpper、ToLower、IndexOf 等)。
您可以创建这些方法,这样您就不必更新大量遗留代码。其中大部分非常简单,最大的区别在于字符串函数,其中旧版 VB 函数使用基于 1 的索引,而 .Net 使用 0 索引。举个例子,这里是重新创建的 Mid 函数,其行为类似于 VB(在此处创建为扩展方法):
''' <summary>
''' Simulates the same functionality provide by the traditional 1 based index Mid function.
''' </summary>
''' <param name="str"></param>
''' <param name="startPos"></param>
''' <param name="length"></param>
''' <returns></returns>
''' <remarks></remarks>
<Extension()> _
Public Function Mid(ByVal str As String, ByVal startPos As Integer, ByVal length As Integer) As String
Return str.Substring(startPos - 1, length)
End Function
以下是您的列表和/或常用列表中的更多内容:
''' <summary>
''' Extension to the Visual Basic Left function
''' </summary>
''' <param name="str"></param>
''' <param name="length"></param>
''' <returns></returns>
''' <remarks></remarks>
<Extension()> _
Public Function [Left](ByVal str As String, ByVal length As Integer) As String
Return str.Substring(0, length)
End Function
''' <summary>
''' Extension to the Visual Basic Right function
''' </summary>
''' <param name="str"></param>
''' <param name="length"></param>
''' <returns></returns>
''' <remarks></remarks>
<Extension()> _
Public Function [Right](ByVal str As String, ByVal length As Integer) As String
Return str.Substring(str.Length - length, length)
End Function
''' <summary>
''' Determines whether a string is a numeric value. This implementation uses Decimal.TryParse to produce it's value.
''' </summary>
''' <param name="str"></param>
''' <returns></returns>
''' <remarks></remarks>
<Extension()> _
Public Function [IsNumeric](str As String) As Boolean
Dim result As Decimal = 0
Return Decimal.TryParse(str, result)
End Function
<Extension()> _
Public Function LCase(str As String) As String
Return str.ToLower
End Function
当使用可移植面向下级平台(.NET 4.0、Silverlight、Windows Phone、Xbox)时,我们不支持 Microsoft.VisualBasic.dll 中公开的大部分功能。
相反,我们使用嵌入式运行时功能。这会将传统上在 Microsoft.VisualBasic.dll 中找到的某些功能嵌入到生成的二进制文件本身中。此页面上的/vbruntime*部分下列出了受支持的功能:http: //msdn.microsoft.com/en-us/library/bb531259.aspx。
仅针对 .NET 4.5 和 Windows 应用商店应用程序时,您可以访问传统的 Microsoft.VisualBasic.dll。
作为一种解决方法,为了帮助您迁移到可移植性,您可以定义自己的模块,将旧的 VB 函数连接到它们的 .NET 等效项:
Public Module VisualBasicBridge
Public Function LCase(value As String) As String
Return value.ToLower()
End Function
End Module
至于 On Error,我不知道在不提供您自己的 Microsoft.VisualBasic 实现并通过 /vbruntime switch/msbuild 属性传递它的情况下桥接该问题的好方法。
所有人都认为这些方法位于 Microsoft.VisualBasic 命名空间中。您可以将它们替换为标准的:
LCase => string.ToLower() InStr => string.IndexOf() ....
用常规的 try/catch 替换“on error”
此致