Переносимая библиотека классов, не поддерживающая многие методы VB

Я беру VB.Net DLL и превращаю ее в переносимую библиотеку классов. Как только я переместил все классы в новый проект для PCL, Visual Studio начала выдавать ошибки для большого количества общего синтаксиса VB, который, как я думал, все еще будет работать нормально. Несколько примеров:

  • LCase
  • InStr
  • Слева
  • Середина
  • При ошибке Перейти к 0
  • ошибся

Возможно ли, что есть какой-то вариант или включение, которое мне нужно, чтобы заставить их работать?


person Ethan    schedule 14.09.2012    source источник


Ответы (4)


При использовании Portable для платформ нижнего уровня (.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 Store, вы действительно получаете доступ к традиционной 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.

person David Kean    schedule 25.09.2012

Вы должны использовать методы сборки, поддерживаемые Portable Библиотеки классов (см. раздел "Сборки"). Вы сможете найти эквиваленты методам, которые вам не подходят (например, SubString, ToUpper, ToLower, IndexOf и т. д.).

person NoAlias    schedule 14.09.2012

Вы можете создать эти методы, чтобы вам не пришлось обновлять тонны вашего устаревшего кода. Большинство из них очень просты, самая большая разница связана со строковыми функциями, где устаревшие функции 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
person b.pell    schedule 08.10.2012

Все думают, что эти методы находятся в пространстве имен Microsoft.VisualBasic. Их можно заменить стандартными:

LCase => string.ToLower() InStr => string.IndexOf() ....

Замените «при ошибке» на обычную попытку/поймать

С наилучшими пожеланиями

person Oscar    schedule 14.09.2012
comment
Где я могу определить эти замены, чтобы мне не приходилось редактировать все миллионы раз, когда они использовались? - person Ethan; 14.09.2012
comment
@Ethan Вы должны определить замены в своей версии Microsoft.VisualBasic. Потому что Microsoft не поддерживает его в переносимых библиотеках классов. Несмотря на то, что Microsoft придерживается политики «совместного развития» Visual Basic и C#, где основные новые функции появятся на обоих языках одновременно - person MarkJ; 14.09.2012