VB.Net DLLを取得して、ポータブルクラスライブラリに変換しています。すべてのクラスをPCLの新しいプロジェクトに移動すると、Visual Studioは、まだ問題なく機能すると思っていた多くの一般的なVB構文に対してエラーをスローし始めました。いくつかの例:
- LCase
- InStr
- 左
- ミッド
- エラー時GoTo0
- エラー
これらを機能させるために必要なオプションやインクルードがいくつかある可能性はありますか?
VB.Net DLLを取得して、ポータブルクラスライブラリに変換しています。すべてのクラスをPCLの新しいプロジェクトに移動すると、Visual Studioは、まだ問題なく機能すると思っていた多くの一般的なVB構文に対してエラーをスローし始めました。いくつかの例:
これらを機能させるために必要なオプションやインクルードがいくつかある可能性はありますか?
ポータブルクラスライブラリでサポートされているアセンブリのメソッドを使用する必要があります(アセンブリのセクションを参照)。動作していないメソッドと同等のものを見つけることができます(例= SubString、ToUpper、ToLower、IndexOfなど)。
ポータブルを使用してダウンレベルプラットフォーム(.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プロパティを介して渡す良い方法を私は知りません。
これらのメソッドを作成して、大量のレガシーコードを更新する必要がないようにすることができます。そのほとんどは非常に単純です。最大の違いは、従来の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
これらのメソッドはすべてMicrosoft.VisualBasic名前空間にあると考えられています。それらを標準のものと置き換えることができます:
LCase => string.ToLower()InStr => string.IndexOf()...。
「エラー時」を通常のtry/catchに置き換えます
よろしくお願いします