1

VB.Net DLLを取得して、ポータブルクラスライブラリに変換しています。すべてのクラスをPCLの新しいプロジェクトに移動すると、Visual Studioは、まだ問題なく機能すると思っていた多くの一般的なVB構文に対してエラーをスローし始めました。いくつかの例:

  • LCase
  • InStr
  • ミッド
  • エラー時GoTo0
  • エラー

これらを機能させるために必要なオプションやインクルードがいくつかある可能性はありますか?

4

4 に答える 4

3

ポータブルクラスライブラリでサポートされているアセンブリのメソッドを使用する必要があります(アセンブリのセクションを参照)。動作していないメソッドと同等のものを見つけることができます(例= SubString、ToUpper、ToLower、IndexOfなど)。

于 2012-09-14T14:05:29.603 に答える
2

ポータブルを使用してダウンレベルプラットフォーム(.NET 4.0、Silverlight、Windows Phone、Xbox)をターゲットにする場合、Microsoft.VisualBasic.dll内で公開されている機能の大部分はサポートされていません。

代わりに、組み込みのランタイム機能を利用します。これにより、Microsoft.VisualBasic.dllに従来から見られる特定の機能が、結果のバイナリ自体に埋め込まれます。サポートされている機能は、このページの/ vbruntime *セクション(http://msdn.microsoft.com/en-us/library/bb531259.aspx )で呼び出されます。

.NET4.5およびWindowsStoreアプリのみを対象とする場合は、従来の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プロパティを介して渡す良い方法を私は知りません。

于 2012-09-25T19:41:27.580 に答える
2

これらのメソッドを作成して、大量のレガシーコードを更新する必要がないようにすることができます。そのほとんどは非常に単純です。最大の違いは、従来のVB関数が1ベースのインデックスを使用し、.Netが0インデックスを使用する文字列関数にあります。例を挙げると、VBのように動作するように再作成されたMid関数があります(ここでは拡張メソッドのように作成されています)。

        ''' <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
于 2012-10-08T15:42:59.413 に答える
1

これらのメソッドはすべてMicrosoft.VisualBasic名前空間にあると考えられています。それらを標準のものと置き換えることができます:

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

「エラー時」を通常のtry/catchに置き換えます

よろしくお願いします

于 2012-09-14T13:51:16.627 に答える