This section illustrates the purpose and usage of all the pragmas that VB Migration Partner currently supports.
このセクションでは、VB Migration Partnerが現在サポートしているすべてのプラグマの目的と使用方法を例証します。
Copies a file into the output project’s main directory and includes the file in the VB.NET project, so that it is automatically copied to the output folder when the project is compiled. It is useful to copy images, Access MDB files, and other data files into the target project. The filespec argument is mandatory: it must be a path relative to the VB6 project’s folder (can’t be an absolute path), can contain wildcards, and must be enclosed in double quotes if it includes spaces:
このプラグマは、出力プロジェクトのメインディレクトリにファイルをコピーして、VB.NETプロジェクトにファイルを含めます。そうすることで、プロジェクトがコンパイルされる際に自動的に出力フォルダにコピーされます。イメージファイル、AccessMDBファイル、及びその他のデータファイルを対象のプロジェクトにコピーするのに役立ちます。filespec引数は必須です。filespecはVB6プロジェクトフォルダに対する相対パスの指定でなくてはなりません(絶対パスは指定不可)。filespecにはワイルドカードを含めることができます。filespecにスペースを含む場合は二重引用符で囲まなければなりません。
'## Rem Add the books.mdb database and all the files in the Images subfolder '## AddDataFile books.mdb '## AddDataFile Images\*.*
Tells VB Migration Partner that a VB6 class is to be considered as a disposable type and be dealt with in a special way when a variable of this type is in the scope of an AutoDispose pragma. It is useful with COM objects that require finalization, for example objects that open a database connection. (Notice that VB Migration Partner recognizes as disposable ADODB objects such as Connection and Recordset.) The typename argument is mandatory and must include the type library name:
このプラグマは、指定したタイプの変数がAutoDisposeプラグマのスコープにあるとき、VB6のクラスがディスポーザブル型であるとみなし、特別な方法で対処するようにVB Migration Partnerに指示します。例えば、データベースのコネクションを開くオブジェクトのように、ファイナライゼーションを要求するCOMオブジェクトに役立ちます。(VB Migration Partnerは、ConnectionやRecordsetのようなADODBオブジェクトをdisposableと認識することに注意してください。)typename引数は、必須であり、以下のようにタイプライブラリ名を含まなければなりません:
'## AddDisposableType CALib.DatabaseManager
Imports a .NET namespace at the project- or file-level. It is useful together with an AddReference pragma, to make all types of the referenced library accessible from the current project. The namespace argument is mandatory and must be enclosed in double quotes if it includes spaces:
このプラグマは、プロジェクトレベルかファイルレベルで.NET名前空間をインポートします。参照されるすべてのタイプライブラリを現在のプロジェクトからアクセスできるようにするAddReference プラグマと一緒に使うと便利です。namespace引数は必須であり、空白を含む場合は以下のように二重引用符で囲まれていなければなりません。:
'## AddReference "c:\code architects\appframework.dll" '## AddImports CodeArchitects.AppFramework
If you specify True in the second argument, the namespace is imported at the file-level by means of an explicit Imports statement. For example the following pragma:
2番目の引数でTrueを指定した場合、そのnamespaceは明示的なImportsステートメントによって、ファイルレベルでインポートされます。 次のプラグマサンプルをご参照下さい。:
'## AddImports ADODB, True
generates the following statement at the top of the file where the pragma resides:
このプラグマは、プラグマを設定したファイルの先頭に以下のステートメントを生成します:
Imports ADODB
Even if it is rarely necessary or desirable, you can even generate explicit Imports statements in all the files in the projects by using an explicit project scope:
殆ど必要でない場合でも、明示的にプロジェクトをスコープすることで、プロジェクト内のすべてのファイルに明示的なImportsステートメントを以下のように生成することができます:
'## project:AddImports ADODB, True
It’s worth noticing that the AddImports pragma has the added effect to drop all the imported namespace off type names, regardless of whether the namespace was imported at the project- or file-level. This feature helps producing more concise and readable code.
namespaceがプロジェクトレベルかファイルレベルでインポートされたかどうかにかかわらず、タイプ名ですべてのインポートされたnamespaceを消すためのAddImports プラグマには相加的効果があります。この機能は、より簡潔で読みやすいコードを作成するのに役立ちます。
Specifies folder where VB Migration Partner can search DLLs and type libraries that have been already converted to VB.NET. The path argument is the absolute name of a directory; recurse is a Boolean that specifies whether the search must be extended to subfolders (if False or omitted, the search is limited to the directory specified in the first argument); searchPattern allows you to restrict the effect of this pragma to certain files.
このプラグマは、VB Migration Partnerが検索できる、既にVB.NETに変換されたDLLとタイプライブラリのフォルダを指定します。pathはディレクトリの絶対パスです。recurseはBoolean型で、検索範囲をサブフォルダに拡張する必要があるかどうかを指定します。(falseか省略されている場合、検索は最初の引数で指定されたディレクトリに制限されます。)searchPatternは、このプラグマの効果を特定のファイルに限定します。
'## AddLibraryPath "c:\MyApps\Libraries" '## AddLibraryPath "c:\Projects\Net", True
The third argument is a regular expression that is applied against the base name of each file in the specified directory (or directory tree), that the file name without path and without extension (the extension is assumed to be “.dll”). For example, the following pragma:
3番目の引数は、指定されたディレクトリ(または、ディレクトリツリー)の各ファイルの基底名に対して適用される正規表現であり、パスと拡張子のないファイル名(拡張子は”.dll”とみなされます)です。次のプラグマサンプルをご参照下さい:
'## AddLibraryPath "c:\Projects\Net", False, "^CodeArchitects\."
would include only the DLL files whose name starts with “CodeArchitects.”.
上記のプラグマは、名前が「CodeArchitects.」で始まるDLLファイルのみが対象になります。
You can apply the AddLibraryPath pragma only by storing it in a *.pragmas file. We suggest that you use the special file named VBMigrationPartner.pragmas, which you can conveniently share among all the projects of a complex application.
AddLibraryPath プラグマは、*.pragmasファイルに含めることによってのみ適用することができます。複雑なアプリケーションのすべてのプロジェクト間で容易に共有できるVBMigrationPartner.pragmasという特別な名前のファイルを使用することを推奨します。
An important note:
if you are migrating a VB6 project group, this pragma should be included in the *.pragmas file that accompanies each project, regardless of whether that specific project uses the classes defined in the DLLs the pragma points to. If the *.vbp files are all located in the same folder, you can use one single VBMigrationPartner.pragmas file in that directory.
VB6プロジェクトグループを移行している場合、そのプロジェクトがプラグマで指定したDLLに定義されているクラスを使用しているかどうかにかかわらず、全てのプロジェクトの*.pragmasファイルにこのプラグマを含めなければなりません。*.vbpファイルが全て同一フォルダに配置されているなら、そのディレクトリ内にただ一つのVBMigrationPartner.pragmasファイルを使用することが出来ます。
Adds a VB.NET source file to the project generated by VB Migration Partner. The filename argument is the absolute path of a *.vb source file; the second optional parameter is False (or omitted) if the file is copied to the output folder and included in the VB.NET project as a regular file, True if the file is added as a link an existing file. The pragma recognizes form and usercontrol source files and automatically imports the *.Designer.vb and *.resx files, if they exist.
このプラグマは、VB Migration Partnerによって生成されたプロジェクトにVB.NETソースファイルを追加します。filename引数は*.vbソースファイルの絶対パスです。2番目の任意のパラメータは、False(または省略)の場合、ファイルが出力先フォルダにコピーされ、通常ファイルとしてVB.NETプロジェクトに含まれます。Trueの場合は、そのファイルは既存ファイルのリンクとして追加されます。このプラグマは、フォームとユーザーコントロールのソースファイルを認識し、*.Designer.vbと*.resxファイルが存在する場合、自動的にインポートします。
'## AddSourceFile "c:\code architects\AppFrameworkFormBase.vb" '## AddSourceFile "c:\code architects\AppMainForm.vb" '## AddSourceFile "c:\code architects\AppFrameworkCommon.vb", True
If the source file being imported requires a reference to an external DLL, you must provide an AddReference pragma; if the source file being imported assumes a project-level Imports, you must provide a suitable AddImports pragma. These pragma must be included in one of the original VB6 files:
インポートされるソースファイルが、外部のDLLの参照を必要とする場合は、AddReference プラグマを設定しなければなりません。インポートされるソースファイルが、プロジェクトレベルでインポートされる場合、適切なAddImports プラグマを設定しなければなりません。これらのプラグマはオリジナルのVB6ファイルの1つに含まれていなければなりません。
'## AddReference "c:\code architects\appframework.dll" '## AddImports CodeArchitects.AppFramework
Include a reference to a .NET assembly in the VB.NET project being created. It is useful when the code you inject by means of InsertStatement pragmas requires a .NET assembly that isn’t automatically referenced by default, for example System.Data.OracleClient. The argument is mandatory, must be either the assembly’s absolute file path or the assembly’s display name, and must be enclosed in double quotes if it includes spaces:
このプラグマは、作成されるVB.NETプロジェクトに、.NETアセンブリへの参照を含めます。これは、InsertStatement pragmasによって挿入するコードが、デフォルトで自動的に参照されないNETアセンブリを必要とする場合に役に立ちます。例えば、System.Data.OracleClientがそれにあたります。引数は必須であり、アセンブリの絶対パスかアセンブリの表示名のどちらかでなければいけません。また、半角スペースを含む場合は二重引用符で閉じられていなければなりません。
'## AddReference C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.OracleClient.dll '## AddReference "System.EnterpriseServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
You typically specify the assembly’s display name for assemblies stored in the GAC.
通常、GACに格納されているアセンブリに対する表示名を指定します。
Specifies that VB Migration Partner should apply the rename rules contained in the specified XML file, or in the default RenameRules.xml file stored in the install folder:
このプラグマは、VB Migration Partnerが指定されたXMLファイル、または、インストールフォルダに格納されているデフォルトのRenameRules.xmlファイルに含まれたリネームルールを適用するように指定します。
'## ApplyRenameRules c:\app\rules.xml
This pragma can be specified in both a *.pragmas file or in source code, however it affects all the projects in the solution being migrated.
このプラグマは*.pragmasファイルとソースコードの両方で指定することが出来ますが、変換されるソリューションに含まれる全てのプロジェクトに影響を与えます。
For more information about renaming rules, see the Renaming program members section.
リネームルールに関する詳しい情報に関しては、プログラムのメンバの名前を変更するの項をご覧下さい。
Signs the VB.NET assembly that results from the conversion, using the specified .snk file. The filename.snk argument is the complete (absolute) path of the .snk file that contains the public/private key pair; delaysign is a Boolean that indicates whether the assembly must be delay-signed (default is False).
このプラグマは、指定された.snkファイルを使用して、変換した結果できあがるVB.NETアセンブリに署名します。filename.snk引数は、公開/秘密鍵の組み合わせを含む.snkファイルの完全(絶対)パスです。delaysign引数は、そのアセンブリが遅延署名されるかどうかを示すBoolean型です。(デフォルト値はFalseです。)
'## AssemblyKeyFile "c:\codearchitects.snk"
Using this pragma is equivalent to tick the “Sign the assembly” option in the Signing tab of the My Project designer after the migration.
このプラグマを使用することは、変換後にMy Projectのプロパティ画面の「署名」タブの「アセンブリの署名」オプションにチェック入れることと同じです。
Determines whether the migrated VB.NET project should preserve binary compatibility with the COM component written in VB6. If the optional argument is False or omitted, then compatibility is enforced only if the original VB6 project specified binary compatibility; if the argument is True, then compatibility is enforced in any case.
このプラグマは、変換されたVB.NETプロジェクトがVB6で書かれたCOMコンポーネントとのバイナリ互換性を維持するかどうかを決定します。任意の引数がFalseか省略されたとき、オリジナルのVB6プロジェクトがバイナリ互換性を指定していた場合にのみ、互換性は維持されます。引数がTrueのときは、どのような場合でも、互換性は維持されます。
'## project:BinaryCompatibility True
When this pragma is active, VB Migration Partner generates a ComClass attribute for each public class in the generated VB.NET project; this attribute specifies the GUIDs of the original coclass, class interface, and event interface of the original VB6 class. In addition, a project-level Guid attribute in AssemblyInfo.vb is generated so that the .NET assembly has same GUID as the original type library. Finally, the Register for COM Interop setting is enabled in the MyProject property page. The neat effect of all these operations is that the .NET DLL is fully compatible with the original COM DLL and all existing VB6/COM clients can continue to work as before but use the new .NET DLL instead. (No recompilation is needed.)
このプラグマがアクティブであれば、VB Migration Partnerは、生成されたVB.NETプロジェクトの各パブリッククラスに対してComClass属性を生成します。この属性は、オリジナルVB6クラスのイベントインターフェース、クラスインターフェース、オリジナルの共同クラス(coclass)のGUIDを指定します。さらに、AssemblyInfo.vbにプロジェクトレベルのGUID属性が生成されるので、.NETアセンブリはオリジナルのタイプライブラリと同じGUIDを保持します。最終的に、MyProjectのプロパティページのCOM Interop設定への登録は有効になります。これらの全ての作用の効果の素晴らしさは、代わりに新しい.NET DLLを利用するとしても、.NET DLLがオリジナルCOM DLLと完全な互換性を持ち、すべての既存のVB6/COMクライアントが以前のように動作するということです。(再コンパイルは不要です)
By default, VB Migration Partner uses the COM DLL specified as the binary-compatible DLL for the original VB6 project. (This is the DLL selected in the Component tab of the Project Properties dialog box in the VB6 IDE.) If the original VB6 project doesn’t specify binary compatibility (but the force argument is True) then VB Migration Partner uses the output DLL to extract all existing GUIDs.
デフォルトでは、VB Migration PartnerはオリジナルVB6のプロジェクトでバイナリ互換のDLLとして指定されたCOM DLLを使用します。 (これは、VB6IDEのProjectプロパティダイアログボックスのコンポーネントタブで選択されたDLLです。) オリジナルのVB6プロジェクトがバイナリ互換を指定していない場合、(force引数はTrueであっても)VB Migration Partnerは、すべての既存のGUIDを抽出するの出力用(output)DLLを使用します。
This pragma is ignored and no warning message is emitted if the VB6 project type isn’t ActiveX DLL or if VB Migration Partner can’t find a COM DLL to be used to extract coclass and interface GUIDs.
VB6プロジェクトタイプがActiveX DLLでない、あるいは、共同クラス(coclass)とインターフェースのGUIDを抽出するのに使用されるCOM DLLをVB Migration Partnerが認識できない場合、このプラグマは無視され、Warningメッセージは出力されません。
As a side-effect of this pragma, all public fields in public classes are rendered as properties: this is necessary because public fields aren’t made visible to COM clients by the ComClass attribute. In addition, if the field was declared using As New, code is generated to preserve the auto-instancing semantics, regardless of whether the field is under the scope of an AutoNew pragma. The effect is therefore similar to the AutoProperty pragma, except that the BinaryCompatibility pragma affects only fields in public classes inside ActiveX DLL projects.
このプラグマの副次的な効果として、パブリッククラスのすべてのパブリックフィールドがプロパティと見なされます。これは、COMClass属性によってパブリックフィールドがCOMクライアントに対して可視化されないために必要です。さらに、そのフィールドがAs Newを使って宣言された場合、ソースコードは、そのフィールドが、AutoNew プラグマのスコープにあるかどうかにかかわらず、オートインスタンシングを維持するように生成されます。そのため、この効果は、BinaryCompatibility プラグマがActiveX DLLプロジェクトの中のパブリッククラスのフィールドだけに影響することを除いては、AutoProperty プラグマと類似しています。
Enables the VB.NET application framework feature. The parameter passed to this pragma correspond to the settings you can find in the Application tab of the My Project designer in Visual Studio. The mainform argument is the name of the startup form and is the only mandatory parameter for this pragma; splashform is the name of the splash form, if any; visualstyles is True if you want to enable Windows XP styles (the default is False); shutdownmode is 0 (the default) if the application exits when the main form closes or 1 if the application exits when all forms close; singleinstance is True if you want to prevent multiple instances of this application (the default is False).
このプラグマは、VB.NETアプリケーション・フレームワークの機能を有効にします。このプラグマに渡されたパラメータは、VisualStudioのMy ProjectデザイナのApplicationタブ内において確認できる設定に対応しています。mainform引数は、スタートアップフォームの名前であり、このプラグマの唯一の必須パラメータです。もしあれば、splashform引数は、スプラッシュフォームの名前です。Windows XPスタイルを有効にしたい場合、visualstyles引数をTrueに設定して下さい。(デフォルトはFalseです。)shutdownmode引数に、0が設定された場合(デフォルト)、メインフォームがクローズされるとアプリケーションが終了し、1ならば、全てのフォームがクローズした時にアプリケーションが終了します。このアプリケーションのインスタンスを複数作らせたくないなら、singleinstance引数をTrueに設定して下さい。(デフォルトはFalseです。)
For example, the following pragma sets frmMain as the main form, frmSplash as the splash screen form, enables XP visual styes and forces the application to close only when all loaded forms are closed:
以下のプラグマは、「スタートアップフォーム」に「frmMain」、「スプラッシュスクリーンフォーム」に「frmSplash」、「XP Visualスタイルを有効にする」にチェック、「シャットダウンモード」に「全てのフォームがクローズした時アプリケーションを終了」が設定されるという例です。
'## EnableAppFramework frmMain, frmSplash, true, 1
You should use this pragma only in standard EXE projects. When this pragma is specified, the Sub Main form is ignored (if the application has one).
このプラグマは、標準のEXEプロジェクトだけに使用して下さい。このプラグマが指定されるとき、(アプリケーションにSub Mainフォームが存在する場合は)Sub Mainフォームは無視されます。
Specify the command line to be passed to the TlbImp.exe tool when importing a type library. typelibfilename is the name of the .dll or .tlb file to be imported (can be just the file name or the complete file path); tlbimpcommand is the complete command that must be passed to the TlbImp.exe tool.
このプラグマは、タイプライブラリをインポートする際に、TlbImp.exeツールに渡されるコマンドラインを指定します。typelibfilename引数は、インポートされるdllか.tlbファイルの名前です。(ファイル名のみ、または完全なファイルパスも指定可能です。)tlbimpcommand引数は、TlbImp.exeツールに渡す完全なコマンドです。
The third and fourth arguments are optional and are taken into account only if the tlbimpcommand argument starts with a “@” character (see later).
3番目と4番目の引数は、任意であり、tlbimpcommand引数が”@”キャラクタから始まる場合にのみ考慮されます。(後述)
Notice that you need to specify the entire path in the first argument only if the current VB6 application uses two distinct type libraries with same file name:
現在のVB6アプリケーションが、同じファイル名の2つの異なったタイプライブラリを使用する場合にだけ、第1引数に完全なパスを指定する必要があることに注意してください:
'## ImportTypeLib mytypelib.dll, "c:\myapp\mytypelib.dll /tlbreference:c:\myapp\support.dll /tlbreference:c:\myapp\interfaces.dll /keyfile:c:\mycompany.snk"
This pragma is necessary when VB Migration Partner fails to correctly locate the type library to be imported or any of the *.dll or *.tlb files such a type library depends on, or when you need to specify any additional option for the TlbImp.exe tool, such as when you want to sign the imported assembly with a strong name. Notice that VB Migration Partner uses this pragma only to correctly resolve a reference to a type library: the type library is actually imported in the current project only if it was referenced by the original VB6 project.
このプラグマは、VB Migration Partnerがインポートされるタイプライブラリやタイプライブラリが依存する*.dllや*.tlbファイルの場所を正確に特定できない場合や、厳密な名前でインポートされたアセンブリに署名したいときのように、TlbImp.exeにオプションを指定しなければならない場合に必要となります。VB Migration Partnerはタイプライブラリの参照を正常に解決するためだけにこのプラグマを使用することに注意してください。つまり、オリジナルのVB6プロジェクトで参照されていた場合にのみ、現在のプロジェクトにタイプライブラリは実際にインポートされます。
You can apply this pragma only by storing it in a *.pragmas file. We suggest that you use the special file named VBMigrationPartner.pragmas, which you can conveniently share among all the projects of a complex application. (As explained above, a type library is effectively imported only if it is referenced by the original VB6 project and this pragma only teaches VB Migration Partner how the type library must be imported.)
*.pragmasファイルに格納することによってのみ、このプラグマを適用することができます。複雑なアプリケーションのすべてのプロジェクト間で共有できる、VBMigrationPartner.pragmasという特別な名前のファイルを使用することをお勧めします。(上述のように、オリジナルのVB6プロジェクトによって参照されている場合にだけ、有効にタイプライブラリがインポートされます。また、このプラグマは、どのようにタイプライブラリをインポートしなければならないかだけをVB Migration Partnerに伝えます。)
As a special case, if the second argument starts with a “@” character it is interpreted as the path of a .NET assembly that is equivalent to the original type library. This syntax variation is useful in two cases: First, if you have already (manually) converted the type library and have obtained the corresponding .NET assembly; second, if the author of the original type library has provided a Primary Interop Assembly for the type library and VB Migration Partner fails to correctly locate such a PIA. Here’s an example of this technique
特殊なケースとして、2番目の引数が「@」キャラクタから始まっている場合、オリジナルのタイプライブラリと同等な.NETアセンブリのパスとして解釈されます。この構文のバリエーションは2つのケースで役立ちます。つまり、1. 既に(手動で)タイプライブラリを変換し、対応する.NETアセンブリを取得している場合。2. タイプライブラリの作者がタイプライブラリに対してプライマリ相互運用機能アセンブリ (PIA) を提供しているが、VB Migration PartnerがそのPIAの場所を正しく特定できない場合です。以下がこのテクニックの例になります:
'## ImportTypeLib msword.olb, "@c:\assemblies\microsoft.office.interop.word.dll"
If the second argument begins with the “@” character, then the assemblyname optional argument should be specified and should be equal to the name of the assembly. This name is usually equal to the assembly’s root namespace, but it can also be a different string. Specifying this value allows VB Migration Partner to determine whether the .NET DLL should be added as a reference for the project being migrated, without having to actually load all the assemblies in all folders referenced by the project itself.
2番目の引数が「@」から始まる場合、任意のassemblyname引数は指定されるべきであり、アセンブリの名前と等しくなるべきです。この名前は通常アセンブリのルートネームスペースと等しいのですが、異なった文字列にすることもできます。この値を設定することでVB Migration Partnerは、プロジェクト自身によって参照されるフォルダすべてのアセンブリを実際には読み込んでいない場合に、.NET DLLが変換されたプロジェクトの参照として追加されるべきかどうかを決定することができます。
For example, assume that you have already migrated a VB6 DLL named “CAFramework” and created an assembly named “CodeArchitects.Framework.dll”. Here’s the pragma that does the trick:
たとえば、すでに「CAFramework」という名前がつけられたVB6 DLLを変換しており、また、「CodeArchitects.Framework.dll」という名前がつけられたアセンブリを作成したと仮定してください。目的を果たすプラグマは、以下になります:
'## ImportTypeLib CAFramework.dll, "@c:\assemblies\CodeArchitects.Framework.dll", "CAFramework"
If you omit the assemblyname argument VB Migration Partner attempts to locate the assembly by matching the assembly name with the filename. For example, in previous example we could omit the third argument if the .NET file were named CAFramework.dll.
assemblyName引数を省略した場合、VB Migration Partnerは、ファイル名とアセンブリ名を照合することによってアセンブリの場所を見つけようとします。例えば、前の例で.NETのファイルがCAFramework.dllと名付けられていた場合は、3番目の引数を省略できます。
If the second argument begins with the “@” character, then the copytoprojectfolder optional argument specifies whether the converted VB.NET project should include a reference to the specified .NET DLL (if the argument is True) or if VB Migration Partner should first copy the .NET DLL into the SupportDLLs subfolder and have the VB.NET project reference this copy. In most cases you can omit this argument and rely on the default behavior (the DLL isn’t copied into SupportDLLs folder); you should specify True only if you later want to deploy the VB.NET project on another computer where the specified .NET DLL isn’t present.
2番目の引数が「@」で始まる場合、任意のcopytoprojectfolder引数は変換されたVB.NETプロジェクトが指定された.NET DLLの参照を含める(引数がTrueの場合)べきかどうか、または、VB Migration Partnerが.NET DLLをコピーしてSupportDLLsサブフォルダに入れ、VB.NETプロジェクトにコピーされたDLLを参照させるかどうかを指定します。ほとんどの場合、この引数を省略してデフォルトの動作に準拠させることができます。 (そのDLLはSupportDLLsフォルダにはコピーされません)。指定された.NET DLLが存在しない別のコンピュータ上にVB.NETプロジェクトを後で配置したい場合にだけ、Trueを指定すべきです。
Determines the type of the current project. It is useful to specify whether an ActiveX EXE project should be converted to an EXE or a DLL Visual Basic project. The prjkind argument is mandatory and can be equal to dll or exe:
このプラグマは現在のプロジェクトのタイプを決定します。ActiveX EXEプロジェクトをEXEのVisual Basicプロジェクトに変換するかDLLのVisual Basicプロジェクトに変換するかを指定するのに役立ちます。prjkind引数は必須でdllまたはexeを指定します:
'## Rem convert the current ActiveX project as a class library '## ProjectKind dll
Allows you to select a different prefix for pragmas inserted in VB6 code. The argument must not include the leading single quote used for remarks:
このプラグマは、VB6コードに挿入されたプラグマのために、異なった接頭語を選択することを許可します。引数は注釈(コメント)に使用される先頭のシングルクォーテーションを含んではいけません:
'## SetPragmaPrefix %%
The argument is considered to be a regular expression, therefore it is necessary to escape the characters that have a special meaning inside a regex. For example, if you want to use a double dot as the pragma prefix, you need this pragma:
この引数は正規表現とみなされます。したがって、正規表現内で特別な意味を持つ文字をエスケープする必要があります。たとえば、プラグマ接頭語としてピリオドを二つ使いたい場合、以下のプラグマが必要となります:
'## SetPragmaPrefix \.\.
Using a regex instead of a simple string allows you to specify multiple pragma prefixes. For example, you can have VB Migration Partner recognize the double dot prefix in addition to the default prefix:
簡単なストリングの代わりに正規表現を使用して複数のプラグマ接頭語を指定することが出来ます。例えば、VB Migration Partnerに、デフォルトの接頭語に加えて二つのピリオドを接頭語として認識させることができます:
'## SetPragmaPrefix (##|\.\.)
The prefix doesn’t need to be 2-char long.
この接頭語の長さを2文字にする必要はありません。
You can apply this pragma only by storing it in a *.pragmas file. We suggest that you use the special file named VBMigrationPartner.pragmas, which you can conveniently share among all the projects of a complex application. Notice, however, that this pragma doesn’t affect the pragmas that are stored in *.pragmas files and applies only to pragmas inserted in VB6 source code files.
このプラグマは*.pragmasファイルに記述することでのみ適用できます。複雑なアプリケーションのすべてのプロジェクト間で容易に共有できる、VBMigrationPartner.pragmasという特別なファイルを使用することをお勧めします。しかし、このプラグマは他の*.pragmasファイルに保存される他のプラグマには有効ではなく、VB6ソースコードファイルに挿入されたプラグマに対してのみ適用されることに注意してください。
This pragma can be useful for two distinct and unrelated reasons:
このプラグマは、関係のない二つの別の理由から役立つ場合があります。
As an example of the second approach, let’s suppose that your VB6 code uses DAO to access an Access database. In the first migration attempt, you generate a VB.NET application that also uses DAO, but you can then improve the result by generating ADO.NET code, which surely requires a good amount of PostInclude, PostProcess, and InsertStatement pragmas. In this case it might make sense to use a different prefix for the pragmas that add just to support ADO.NET, so that you can quickly switch from the DAO to the ADO.NET version by just editing one SetPragmaPrefix pragma.
2番目のアプローチの例は、VB6のソースコードがAccessデータベースにDAOを使用して接続する場合です。最初の変換ではDAOを使用するVB.NETアプリケーションを生成したとしてもADO.NETのソースコードを生成することで結果を改善することができます。それには、PostInclude、PostProcessとInsertStatement プラグマを適切に使用しなければなりません。この場合、ADO.NETをサポートするためのプラグマに異なる接頭語を使用することを理解できるかもしれません。その結果、SetPragmaPrefix pragmaを編集するだけで、迅速にDAOからADO.NETに切り替えることができます。
Specifies how a class must be rendered during the migration process. The mode argument can be Class, Interface, ClassAndInterface, and Module. This pragma can’t be specified at the project-level:
このプラグマは、変換中にどのようにクラスを変換するかを指定します。mode引数は、Class引数にも、Interface引数にも、ClassAndInterface引数にも、Module引数にもなります。 プロジェクトレベルでこのプラグマを指定することは出来ません:
'## ClassRenderMode Interface
By default, all VB6 classes are rendered as VB.NET classes; however, if the class name appears in one or more Implements statements, the class is also rendered as an interface. This pragma allows developers to generate the interface even if the class doesn’t appear in any Implements statement (which may be necessary when converting an ActiveX DLL or ActiveX EXE project without also converting a client application) as well as generate only the interface and not the original class. This pragma can also be useful to convert a GlobalMultiuse or GlobalSingleUse class into a VB.NET module.
デフォルトでは、すべてのVB6のクラスは、VB.NETのクラスにされます。しかしながら、クラス名が1つ以上のImplementsステートメントに記述されている場合、クラスはインターフェースにもなります。このプラグマは、クラスがどのImplementsステートメントにもなくてもインターフェースを生成させることを可能にします。(これは、クライアントのアプリケーションを移行せずにActiveX DLL や ActiveX EXEを移行するときに必要になるかもしません。)それだけではなく、元のクラスにはないインターフェースを生成することもできます。このプラグマは、GlobalMultiuseクラスやGlobalSingleUseクラスをVB.NETモジュールに変換するのに役立ちます。
Specifies whether the current file must be ignored by VB Migration Partner. It is useful for files containing modules and classes that have a VB.NET counterpart – for example, the methods in the VBMigrationPartner_Support module. If the argument is True or omitted, the current file is ignored by VB Migration Partner:
このプラグマは、VB Migration Partnerが現在のファイルを無視しなければならないかどうか指定します。それは、モジュールを含むファイルとVB.NETに対応したクラス-例えばVBMigrationPartner_Supportモジュールのメソッド-にとって役立ちます。引数がTrueか省略された場合、現在のファイルはVB Migration Partnerに無視されます:
'## ExcludeCurrentFile
This pragma can’t be specified at the project-level.
プロジェクトレベルでこのプラグマを指定することはできません。
Specifies how event definitions in user controls should be rendered. By default, VB Migration Partner generate an event dispatcher class for each event exposed by the user control, and then uses the dispatcher’s Raise method instead of the standard RaiseEvent keyword. If the argument is False then the standard .NET event mechanism is used instead:
このプラグマは、ユーザコントロールのイベント定義をどのように変換するかを指定します。デフォルトでは、VB Migration Partnerは、ユーザコントロールによって公開されている各イベントに対してイベントディスパッチャクラスを生成し、標準RaiseEventキーワードの代わりにディスパッチャのRaiseメソッドを使用します。引数がFalseの場合、標準的な.NETイベントが代わりに使われます。
'## Rem don’t use event dispatchers in this user control '## ExcludeCurrentFile
VB Migration Partner’s default implementation of events inside user controls ensures that events are handled correctly even if the control belongs to a control array or is instantiated dynamically by means of a Controls.Add method. You can disable this feature and produce more compact and efficient code if you are sure that neither condition is met.
ユーザコントロール内部のイベントのVB Migration Partnerにおけるデフォルトの実装は、コントロールがコントロール配列に属している場合や、Controls.Addメソッドによって動的にインスタンス化されるとしても、イベントが正しくハンドルされることを保証します。どちらの条件にも合わないことが確かならば、この機能を無効にしてより小さくて効率的なソースコードを生成することができます。
Allows VB Migration Partner to reuse existing *.resx files, either created manually or generated by a previous migration (possibly with the Upgrade Wizard). The resxpath argument is the path of the folder that contains the existing *.resx files.
このプラグマにより、VB Migration Partnerは、手作業で作成された、または、前回の変換(おそらくアップグレードウィザード)で生成された既存の*.resxファイルを再利用できます。resxpath引数は、既存の*.resxファイルを含むディレクトリパスです。
'## project:ReuseResxFiles c:\MigratedApps\TestApp
The argument can be either an absolute or a relative path; in the latter case, it is considered to be relative to folder where the VB6 project being migrated resides. In addition, the ${ProjectPath} placeholder is replaced by the name of the folder where the VB6 project is stored. This placeholder and the ability to use relative path allows you to store this pragma in the global VBMigrationPartner.pragmas file, provided that you have used a consistent naming schema for your migrated apps. For example, if all your migrated projects are stored in the c:\MigratedApps directory tree, you might use the following pragma
この引数は絶対パスまたは相対パスのどちらかになり得ます。後者の場合、変換されたVB6プロジェクトが存在するフォルダに対する相対パスとなります。さらに、プレースホルダーの$(ProjectPath)はVB6のプロジェクトが格納されているフォルダの名前に置き換えられます。このプレースホルダーと相対パスのおかげで、移行したアプリケーションに対して、一貫した命名体系を使用したことがあるならば、このプラグマをグローバルVBMigrationPartner.pragmasファイルに保存することができます。例えば、すべての変換されたプロジェクトがc:/MigratedAppsディレクトリツリーに格納される場合、以下のプラグマを利用できます。
'## project:ReuseResxFiles c:\MigratedApps\${ProjectPath}
This pragma is especially useful when converting forms that contain one or more ActiveX controls. In some (rare) cases, in fact, VB Migration Partner fails to correctly generate the OcxState property for these ActiveX controls. If you see that an ActiveX control isn’t migrated correctly, you might try to convert the project using Microsoft Upgrade Wizard, and then use this pragma so that VB Migration Partner can reuse the generated *.resx files.
このプラグマは、1つ以上のActiveXコントロールを含むフォームを変換するときに特に役立ちます。いくつかの(稀な)ケースで、実際に、VB Migration Partnerは、これらのActiveXコントロールに対して正しくOcxStateプロパティを生成することができないことがあります。ActiveXコントロールが正確に変換されていないことがわかった場合、MSUpgrade Wizardを使用してプロジェクトを変換し、生成された*.resxファイルを再利用するようこのプラグマを使用してください。
Notice that you can specify this pragma at the project-, file, or component-level. When used at the file or component level, you can omit the argument to disable this feature for a specific form or control.
プロジェクトレベル、ファイルレベル、またはコンポーネントレベルでこのプラグマを指定できることに注目してください。ファイルレベルまたはコンポーネントレベルで使用する場合は、特定のフォームまたはコントロールに対してこの機能を無効にするための引数を省略することができます。
Indicates that the current class should be extended with two CType Operator methods that provide support for implicit conversion from/to the VB6Variant type. The argument should be True (or omitted) to enable this feature, or False to disable it. (The feature is disabled by default, therefore you typically use the False value only to override the setting at the project-level.)
このプラグマは、現在のクラスが、VB6Variantタイプへの(あるいはVB6Variantタイプからの)暗黙的な変換をサポートする2つのCType演算子法(関数)で拡張されるべきであることを示します。この機能は、引数がTrue(または省略)の場合に有効になり、Falseの場合に無効になります。(この機能のデフォルトは使用不可です。したがって、通常は、プロジェクトレベルの設定を無効にするためにだけFalse値を使います。)
'## project:VariantConversionSupport
Starting with release 1.11, all the classes defined in the VBLibrary support implicit conversion from/to the VB6Variant type. In general it is a good idea to extend this feature to all the forms, classes, and usercontrols of the projects you migrate.
リリース1.11以降は、VBLibraryで定義されているすべてのクラスは、VB6Variantタイプへ(から)の暗黙的な変換をサポートします。一般に、変換を行うプロジェクトのすべてのフォーム、クラス、そしてユーザコントロールに対してこの機能を拡張するのが良い方法でしょう。
Associates a custom attribute to the current project, class, method or a specific variable. The text argument must be a valid VB.NET attribute. Surrounding < and > delimiters are optional:
このプラグマは、現在のプロジェクト、クラス、メソッドや特定の変数に対してカスタム属性を関連付けます。text引数は有効なVB.NETの属性でなければなりません。囲むためのデリミタの「 < 」と「 > 」は任意です。
'## project:AddAttribute Description("this is an assembly") Sub SetSize(w As Integer) ' attributes associated with a method can be inserted inside the method '## AddAttribute MyCustomAttribute(true) ' attributes associated with parameters require a prefix '## x.AddAttribute Description("the object’s width") … End Sub
This pragma may not work as intended with fields that are converted into separate properties, e.g. public variables declared with As New that fall under the scope of an AutoNew pragma.
このプラグマは別々のプロパティに変換されるフィールドには意図したとおりに機能しないかもしれません。例えば、AutoNewプラグマのスコープにあるAs Newで宣言されたパブリック変数がそうです。
Specifies how the declaration of arrays with a nonzero lower index must be converted to VB.NET. The valid values for the mode argument are Unchanged (arrays are migrated verbatim, the default behavior), ForceZero (the lower index is forced to be zero), Shift (both the lower and upper indexes are shifted so that the number of elements in the array doesn’t change), VB6Array (convert the array into a VB6Array object), or ForceVB6Array (convert the array into the VB6Array even if the lower index is zero):
このプラグマは、下限のインデックスがゼロ以外の配列の宣言をどのようにVB.NET.に変換するかを指定します。mode引数に対する有効な値は、Unchanged(デフォルトの動作で、配列は、言葉通りに変換されます。)、ForceZero(下限のインデックスをゼロにします。)、Shift(配列の要素の数が変わらないように下限と上限の両方のインデックスをずらします。)、VB6Array(は配列をVB6Arrayオブジェクトに変換します。)、そしてForceVB6Array(は、下限のインデックスがゼロだったとしても、配列をVB6Arrayに変換します)です。
'## ArrayBounds VB6Array
Notice that this pragma, like all pragmas that can reference arrays, should be inserted immediately before the Dim statement that declares the array, rather than before the ReDim statement that actually creates the array. Pragmas inserted inside the method where the ReDim statement appears are ignored.
このプラグマは、配列を参照する全てのプラグマのように、実際に配列を作るReDimステートメントの前ではなく、配列を宣言するDimステートメントの直前に挿入されなければならないことに注意してください。ReDimステートメントが現れるメソッドの内側で挿入されたプラグマは、無視されます。
Also notice that this pragma only affects the declaration (DIM) of an array, not the value of indexes used in code to reference individual array items. For that purpose you should use a ShiftIndexes pragma.
また、このプラグマが配列の宣言(DIM)にのみ効果があることに注意して下さい。個々の配列要素を参照するソースコード上の要素の値には効果がありません。これを解決するためにはShiftIndexesプラグマを使用するべきです。
Specifies the rank of an array. It is useful when VB Migration Partner isn’t able to determine the correct rank of a multi-dimensional array taken as an argument, returned by a property or function, or declared at the class level but initialized elsewhere. Consider the following VB6 example:
このプラグマは、配列の次元数を指定します。この引数は、VB Migration Partnerが、クラスレベルで宣言されてはいるが他の場所で初期化された、または、ファンクションやプロパティによって戻された、引数となっている多次元配列の正しい次元数が判断出来ないときに役立ちます。以下のVB6の例を考えてください:
'## arr.ArrayRank 2
'## GetArray.ArrayRank 2
Dim arr() As Integer
Function GetArray(initialize As Boolean) As Integer()
If initialize Then ReDim arr(10, 10)
GetArray = arr
End Function
If it weren’t for the ArrayRank pragma, the field and the method would return a vector instead of a two-dimensional array:
もし、ArrayRank プラグマがなかったら、フィールドとメソッドは二次元配列の代わりに一次元配列を返します。
Dim arr(,) As Short Function GetArray(initialize As Boolean) As Integer(,) If initialize Then ReDim arr(10, 10) Return arr.Clone() End Function
Notice that this pragma must have a nonempty scope.
このプラグマは、空ではないスコープを持たねばならないことに注意してください。
Also notice that this pragma, like all pragmas that can reference arrays, should be inserted immediately before the Dim statement that declares the array, rather than before the ReDim statement that actually creates the array. Pragmas inserted inside the method where the ReDim statement appears are ignored.
また、このプラグマは、実際に配列を作成するReDimステートメントの前ではなく、配列を参照することができるすべてのプラグマと同様、配列を宣言するDimステートメントの直前に挿入すべきです。ReDimステートメントがある場所に挿入されたプラグマは無視されます。
Informs VB Migration Partner that a given Object, Variant, or Control variable must be translated as if it were of a specific VB6 type. It is useful to correctly solve default properties even in late-bound references. For example, consider the following VB6 code:
このプラグマは、与えられたObject、VariantまたはControlが、あたかも特定のVB6タイプから変換されたように変換されなければならないことを VB Migration Partnerに伝えます。これは遅延バインディングの参照であった場合においてもデフォルトプロパティの正しい解決に役立ちます。以下のVB6の例を御覧下さい:
'## ctrl.AssumeType TextBox
Dim ctrl As Control
For Each ctrl In Me.Controls
If TypeOf ctrl Is TextBox Then ctrl = ""
Next
If it weren’t for the AssumeType pragma, VB Migration Partner wouldn’t know how to convert the reference to the default property:
AssumeType プラグマがなかったら、VB Migration Partnerはデフォルトプロパティに対する参照をどのように変換すればよいかわかりません:
Dim ctrl As Object For Each ctrl In Me.Controls If TypeOf ctrl Is VB6TextBox Then ctrl.Text = "" Next
Notice that this pragma must have a nonempty scope.
このプラグマは、空ではないスコープを持つ必要があることに注意してください。
Specifies how fields pointing to disposable objects must be converted. The mode argument can be No, Yes, or Force. If equal to Yes or omitted, all Set x = Nothing statements are converted into calls to the SetNothing6 method; if equal to Force, classes that contain disposable field is marked as IDisposable and all such fields are disposed of in the Dispose method; if equal to No, disposable objects aren’t handled in any special way (this setting represents the default behavior and can be useful to override a pragma with a broader scope). The AutoDispose pragma can be applied to the project, file, class, or individual field or variable level.
このプラグマは、disposableオブジェクトを指し示すフィールドを、どのように変換しなければならないかを指定します。mode引数はNo、Yes、Forceを指定することが可能です。引数がYesか省略された場合、すべての「Set x = Nothing」ステートメントは、SetNothing6メソッドの呼び出しに変換されます。また、引数がForceであれば、disposableフィールドを含むクラスはIDisposableとして注釈が付けられ、そのようなフィールドはすべてDisposeメソッドに配置されます。引数がNoであれば、disposableオブジェクトはいかなる特別な方法でも取り扱われません。(この設定はデフォルトの動作を意味し、より広いスコープのプラグマをオーバーライドするのに役立ちます。)AutoDispose プラグマは、プロジェクトレベル、ファイルレベル、クラスレベルまたは個々のフィールドレベル、変数レベルに適用することができます。
'## Rem force disposal of all disposable objects in current class '## Rem except those of the Test method '## AutoDispose Force '## Test.AutoDispose No
Specifies how auto-instancing object – that is, fields and variables declared with the As New clause – must be converted. By default, such declarations are converted verbatim to VB.NET, even though the VB.NET semantics differs from VB6. If the mode argument is True or omitted, then VB Migration Partner generates code that ensures that the VB.NET is identical to VB6.
このプラグマは、自動インスタンス化オブジェクト−いわゆる、As New節で宣言されたフォールドや変数−をどのように変換するかを指定します。デフォルトではそのような宣言は、たとえVB6の意味に違いがあったとしても、文字通りにVB.NETに変換されます。mode引数がTrueもしくは省略されている場合は、VB Migration PartnerはVB.NETがVB6と完全に同一になるコードを生成します。
'## Rem ensure that Connection and Recordset objects have auto-instancing semantics
'## Connection.AutoNew
'## Recordset.AutoNew
Public Recordset As New ADODB.Recordset
Public Connection As New ADODB.Recordset
The actual code being generated is different for local variables and fields: if the object is declared as a class-level field, VB Migration Partner converts it into a property whose Get block contains code that implements the auto-instancing behavior; if the object is declared as a local variable, all occurrences are wrapper by AutoNew6 method calls, that ensure that the object is instantiated if necessary.
実際に生成されたコードはローカル変数とフィールドでは異なります。オブジェクトがクラスレベルフィールドとして宣言された場合、VB Migration PartnerはGetBlockが自動インスタンス化動作を実行するコードを含むプロパティに変換します。オブジェクトがローカル変数として宣言された場合、全てのオカレンスはAutoNew6メソッド呼び出しによるラッパーになり、オブジェクトが必要であればインスタンス化され保証されます。
Specifies that all members of a given VB6 type in the pragma’s scope must be converted to a given .NET type. It is useful to convert Variant variables to VB6Variant objects and Control variables to System.Windows.Forms.Control variables (without this pragma, such variables would be migrated as Object variables):
このプラグマは、プラグマのスコープに存在する、特定のVB6タイプのすべてのメンバーを、特定の.NETタイプに変換するように、指定できます。これは、Variant変数をVB6Variantオブジェクトに、Control変数をSystem.Windows.Forms.Control変数に変換するときに役に立ちます。(このプラグマがない場合は、それらの変数は、Object変数として移行されます):
'## ChangeType Variant, VB6Variant '## ChangeType Control, Control
Specifies whether public fields should be rendered as properties. If the argument is True (or omitted) then all public fields are replaced by a read-write property with same name. For example, the following VB6 code:
このプラグマは、パブリックフィールドがプロパティとしてレンダリングされる必要があるかどうかを指定します。引数がTrue(または省略された)場合全てのパブリックフィールドは、同じ名前のリード、ライトプロパティに置き換えられます。例えば以下のVB6コードを御覧下さい:
'## AutoProperty
Public Name As String
Public Widget As New Widget
is rendered as follows:
以下のようにレンダリングされます:
Public Property Name() as String Get Return Name_InnerField End Get Set(ByVal value As String) Name_InnerField = value End Set End Property Private Name_InnerField As String = "" Public Property Widget() As Widget Get If Widget_InnerField Is Nothing Then Widget_InnerField = New Widget() Return Widget_InnerField End Get Set(ByVal value As Widget) Widget_InnerField = value End Set End Property Private Widget_InnerField As Widget
Notice that the AutoProperty pragma automatically enforces the auto-instancing (As New) semantics if possible, regardless of whether the variable is under the scope of an AutoNew pragma.
AutoPropety プラグマは自動的に、変数がAutoNew プラグマのスコープの配下にあるかどうかに関わらず、可能であれば自動インスタンス化(As New)を行います。
Specifies how arrays contained inside a VB6Variant member should be processed. If the argument is True (or omitted), the array contained inside all the VB6Variant variables under the scope of the pragma is considered to be a Variant array (which has been translated as a VB6Variant array). If False, the contained array is considered as an array of regular objects.
このプラグマは、VB6Variantメンバーに含まれる配列がどのように処理されなければならないかを指定します。引数がTrue(または省略)の場合、プラグマのスコープの全てのVB6Variant変数に含まれる配列は、Variant配列(VB6Variant配列として変換されます)にみなされます。Falseの場合、含まれている配列は通常のオブジェクト配列とみなされます。
'## project:ContainsVariantArray
By default, when VB Migration Partner parses a Variant member that is followed by an index and a dot, it assumes that the member contains an array of regular objects. To see why this pragma can be useful, consider the following VB6 code:
デフォルトで、VB Migration Partnerがインデックスとドットがあとに続くVariantメンバーを分析する際、メンバーがレギュラーのオブジェクト配列を含んでいると仮定します。このプラグマがなぜ役に立つかを確認するために、以下のVB6コードを御覧ください:
'## ChangeType Variant, VB6Variant
Sub Test(ByVal arrObj() As Object, ByVal arrVar() As Variant)
Dim v1 As Variant, v2 As Variant
V1 = arrObj
v2 = arrVar
v1(0).DoSomething
v2(0).DoSomething
End Sub
This is how the code is converted to VB.NET if no other pragma is used:
他のプラグマが使用されていない場合、コードは以下のように.NETに変換されます:
Sub Test(ByVal arrObj() As Object, ByVal arrVar() As VB6Variant) Dim v1 As VB6Variant, v2 As VB6Variant V1 = arrObj v2 = arrVar v1(0).DoSomething ' << correct v2(0).DoSomething ' << wrong! End Sub
The problem in previous code is that the v2 variable contains an array of VB6Variant objects, therefore the reference to v2(0) returns a VB6Variant element which does not expose the DoSomething method. You solve the problem by adding the following pragma inside the Test method:
前述のコードの問題は、v2変数がVB6Variantオブジェクトの配列を含んでいるということです、したがって、v2(0)の参照がDoSomethingメソッドを公開しないVB6Variant要素を返します。Testメソッド内に、次のプラグマを追加することで、この問題を解決することが出来ます:
'## v2.ContainsVariantArray
which causes the following code to be generated
以下のコードが生成されます。
v2(0).Value.DoSomething ' << correct
IMPORTANT:
This pragma has been obsoleted in release 1.11.01. In this and all subsequent releases, the indexing operation on a simple VB6Variant variable always returns a VB6Variant object, therefore VB Migration Partner always appends the “.Value” suffix when the expression is followed by a dot. The ContainsVariantArray pragma is therefore useless and is ignored during the migration process (but no warning is issued).
このプラグマは、リリース1.11.01で廃棄されました。これ以降のリリースにおいて、単純なVB6Variant変数のインデックス操作は常にVB6Variantオブジェクトを返します。したがって、式の後にドットが続くとき、VB Migration Partnerは常に「.Value」接尾語を追加します。 ContainsVariantArray プラグマは役に立たず、変換プロセスの間、無視されます(警告は発行されません)。
Specifies whether VB Migration Partner should generate one Dim statement for each local variable that isn’t declared explicitly. If the argument is True or omitted, all local variables in the converted VB.NET methods under the pragma’s scope are declared explicitly.
このプラグマは、VB Migration Partnerが、明示的に宣言されない各ローカル変数のために、1つのDimステートメントを生成するかどうか指定します。引数がTrueか省略された場合、プラグマのスコープ下にある、変換されたVB.NETメソッド内の、全てのローカル変数が明示的に宣言されます。
'## Rem generate code for implicitly-declared variables in current file '## InsertStatement Option Explicit On '## DeclareImplicitVariables
Specifies whether VB Migration Partner should generate a method overload for methods that take a ParamArray argument and that modify an element of the array argument inside the method. The method overload uses Optional ByRef parameters instead of one single ParamArray parameter, and the maxargs value specifies the maximum number of arguments that you expect. For example, assume that you have the following VB6 code:
このプラグマは、VB Migration Partnerが、ParamArray引数を使い、メソッド内部の配列引数の要素を変更するメソッドに対して、メソッドオーバーロードを生成するべきかどうかを指定します。メソッドオーバーロードは1つのParamArray引数の代わりに、Optional ByRef引数を使います、そして、maxargsの値は、想定される引数の最大数を指定します。たとえば、以下のVB6コードを御覧下さい。:
'## FixParamArray 3
Sub Increment(ParamArray arr() As Variant)
Dim i As Integer
For i = 0 To UBound(arr)
arr(i) = arr(i) + 1
Next
End Sub
Notice that the elements of the arr ParamArray array are modified inside the method and these changes are propagated back to callers under VB6 but not under VB.NET. However, the FixParamArray pragma causes the following code to be generated:
VB6では、ParamArray配列の要素arrはメソッドの中で変更され、これらの変更が呼び出し元に反映されますが、VB.NETではそうならないことに注目してください。しかし、FixParamArray プラグマは以下のコードを生成させます:
Public Sub Increment(Optional ByRef arr0 As Object = Nothing, _ Optional ByRef arr1 As Object = Nothing, _ Optional ByRef arr2 As Object = Nothing) Dim arr() As Object = GetParamArray6(arr0, arr1, arr2) Try Increment(arr) Finally SetParamArray6(arr, arr0, arr1, arr2) End Try End Sub Public Sub Increment(ByVal ParamArray arr() As Object) Dim i As Short For i = 0 To UBound6(arr) arr(i) += 1 Next End Sub
The neat effect is that any call to the Increment method that takes 3 arguments or fewer will use the first overload, which ensures that changes to any argument are correctly propagated back to callers even in VB.NET.
この素晴らしい効果は、3個以下の引数を取るIncrementメソッドのどの呼出も、最初のオーバーロードを使用することです。そして、この最初のオーバーロードにより、VB.NETにおいてさえ、引数の変更が呼出元に正しく戻されます。
If the maxargs argument is 0 or omitted, no overloaded method is generated. (This behavior is useful to override another FixParamArray pragma with broader scope.) Values higher than 20 are rounded down to 20.
maxargs引数が0または省略の場合はオーバーロードメソッドを生成しません。(この動作はより広いスコープのFixParamArrayプラグマを上書きするのに便利です。)20より多い値は20で切り捨てられます。
Specifies whether VB Migration Partner should try to infer the type of the local variables, class fields, functions, and properties that are under the scope of this pragma. The mode argument can be one of the following: No if type inference is disabled; Yes if type inference is enabled only for members that lacks an explicit As Variant clause and for local variables that are implicitly declared; Force if type inference is enabled for all Variant members. The second argument is True if type inference is extended to method parameters.
このプラグマは、VB Migration Partnerがこのプラグマのスコープにある、ローカル変数、クラスフィールド、関数、及びプロパティのタイプをどのように推測しなければならないかを指定します。mode引数は、次のいずれかを指定できます:No タイプの推測は適用されない。Yes 明示的なAs Variant節が欠落したメンバーか、暗黙的に宣言されるローカル変数のみにタイプの推測が適用される。Force 全てのVariantメンバーにタイプの推測が適用される。二つ目の引数がTrueであれば、タイプの推測はメソッドパラメータも対象とします。
VB Migration Partner is capable, in most cases, to correctly deduce a less generic data type for Variant local variables, parameters, class fields, functions and properties. This applies both to members that were explicitly declared as Variant and to members that lacked an explicit As clause. To see how this feature works, consider the following VB6 code:
ほとんどの場合VB Migration Partnerは、バリアント型のローカル変数、パラメータ、クラスフィールド、関数、プロパティの汎用的なデータ型を、正しく推測することが出来ます。これは、Variantと明らかに宣言されたメンバーと、明示的なAs節を欠いていたメンバーに適用されます。この機能がどのように働くかは、以下のVB6コードを見てください。
'## DeclareImplicitVariables True
'## InferType Force, True
Private m_Width As Single
Property Get Width ()
Width = m_Width
End Property
Property Let Width (value)
m_Width = value
End Property
Sub Test(x As Integer, frm)
Dim v1 As Variant, v2
v1 = x * 10
v2 = Width + x
Set frm = New frmMain
res = frm.Caption
End Sub
Here’s the migrated VB.NET code:
VB.NETに移行すると以下のようになります:
Private m_Width As Single Public Property Width() As Single Get Return m_Width End Get Set(ByVal value As Single) m_Width = value End Set End Property Public Sub Test(ByRef x As Short, ByRef frm As Form1) ' UPGRADE_INFO (#0561): The 'frm' symbol was defined without an explicit "As" clause. ' UPGRADE_INFO (#05B1): The 'res' variable wasn't declared explicitly. Dim res As String = Nothing Dim v1 As Integer ' UPGRADE_INFO (#0561): The 'v2' symbol was defined without an explicit "As" clause. Dim v2 As Single v1 = x * 10 v2 = Width + x frm = New Form1() res = frm.Caption End Sub
Extending the pragma scope to method parameters isn’t always a good idea, because the current version of VB Migration Partner infers the type of parameters by looking at assignments inside the method and doesn’t account for implicit assignments that result from method calls. For this reason, the type inferred during the migration process might not be correct in some cases.
VB Migration Partnerの現在のバージョンは、メソッド内での割り当てを調べることでタイプの推測を行い、メソッドの呼び出しからの暗黙の割り当てを考慮していないため、プラグマのスコープをメソッドパラメータに拡張するのは、常に最適な方法というわけではありません。この理由から、移行プロセス中に推測されるタイプは、場合によっては正しくないかもしれません。
Important note:
Type inference isn’t an exact science and you should always double-check that the data type inferred by VB Migration Partner is correct. Even better, we recommend that you use the InferType pragma only during in early migration attempts and then you later assign a specific type to members by editing the original VB6 code or by means of the SetType pragma.
タイプの推測は万能ではありませんので、VB Migration Partnerによって推測されるデータ型が正しいことを常に再確認する必要があります。更にはInferType プラグマは変換の初期段階においてのみ使用することをお勧めします。その後、元のVB6コードを編集するか、SetType プラグマによってメンバーに特定のタイプを割り当ててください。
Specifies which late-bound members should be considered as methods with one or more ByRef arguments. The first methodregex argument is a regular expression that specifies which member names are to be considered as the names of methods with ByRef arguments (use “.+” to indicate “all members”). The second indexregex argument is a regex that identifies all (0-based) numeric indexes of ByRef parameters of indicated methods (if omitted, it defaults to “\d+”, which means “all parameters”). The third parameter is optional and is considered as a regular expression that specifies which Variant and Object fields and variables the pragma applies to (if omitted, it defaults to “.+” and therefore all the fields and variables in the pragma’s scope are affected).
このプラグマは、どの遅延バインディングメンバーが、一つ以上のByRef引数を持つメソッドとして考慮されるべきかを指定します。最初のmethodregex引数は、どのメンバーの名前がByRef引数を持つメソッドの名前としてみなすべきかを指定する正規表現です。(全てのメンバーを示す、”.+”を使用して下さい。) 第2のindexregex引数は、示されたメソッドのByRefパラメータのすべての(0ベースの)数値インデックスを特定する正規表現です。(省略された場合、デフォルトで、全てのパラメータを意味する”\d+”になります。)第3の引数は任意であり、プラグマが、どのVariant、Objectフィールド、および変数に適用されるかを指定する正規表現としてみなされます。(省略された場合、デフォルトで”.+”となり、プラグマのスコープのすべてのフィールドと変数が影響を受けます)
' all the late-bound members in current project are to be considered as ' methods that take ByRef arguments '## project:LateBoundMethods ".+"
This pragma becomes important in applications that use late-binding quite extensively and accounts for a subtle but important difference between VB6 and VB.NET. Under VB6, passing a writable property to a ByRef parameter of a method does not affect the property (because behind the scenes VB6 is actually passing the return value from the Property Get block). Vice versa, passing a writable property to a ByRef parameter does modify the property value on exiting the method under VB.NET.
このプラグマはかなり広範囲に遅延バインディングを使い、VB6とVB.NETの微妙であるが、重要な違いの主な原因となるアプリケーションでは重要になります。VB6では、メソッドのByRefパラメータに書き込み可能なプロパティを渡すのは、プロパティに影響を与えません(実際には、VB6は裏で、”Property Get”ブロックの戻り値を渡しているからです。) 逆に、VB.NETでは、書き込み可能なプロパティをByRefパラメータへ渡すと、メソッドを出る時にプロパティの値を修正します。
Consider the following VB6 code:
以下のVB6コードを御覧ください。
Sub Test(ByRef lbl As Label, ByVal txt As TextBox, ByVal wi As Widget, ByVal obj As Object) Set obj = wi wi.ModifyValues lbl.Caption, txt.Text obj.ModifyValues lbl.Caption, txt.Text End Sub
If the ModifyValue in the Widget class takes one ByRef argument, this is how VB Migration Partner translates the code to VB.NET:
Widget クラスでのModifyValueが1つのByRef引数をとる場合、このようにして、VB Migration PartnerはコードをVB.NETに変換します:
Sub Test(ByRef lbl As VB6Label, ByVal wi As Widget, ByVal obj As Object) Set obj = wi wi.ModifyValue(ByVal6(lbl.Caption), ByVal6(txt.Text)) obj.ModifyValue(lbl.Caption, txt.Text) End Sub
The ModifyValue method can modify the lbl.Caption and txt.Text writable properties under VB. NET and that this modification would break functional equivalence with the original VB6 code. VB Migration Partner knows how to work around this difference and correctly wraps the two property references inside a ByVal6 method when calling the wi.ModifyValue method.
ModifyValueメソッドはVB.NETでlbl.Captionとtxt.Textの書き込み可能なプロパティを変更できます、そして、この変更は元のVB6コードで機能的な等価性を壊すでしょう。 wi.ModifyValueメソッドを呼ぶとき、VB Migration Partnerはどのようにこの違いを回避するかを把握していて、ByVal6メソッド内の正確に2つのプロパティの参照箇所を包みます。
VB Migration Partner can carry out this correctly because the ModifyValue is referenced using early-binding (i.e. the wi member has a definite type) and it is possible to detect that the lbl.Caption and txt.Text values are being passed to a ByRef parameter. Conversely, the obj.ModifyValue call uses late binding and VB Migration Partner can’t decide whether the called method takes one or more ByRef parameters.
ModifyValueは、初期バインディングを使用して参照されているため(つまりwiメンバーが明確なタイプを持っている)VB Migration Partnerはこれを正しく行うことができ、lbl.Captionとtxt.Text値がByRefパラメータに渡されることを検出することが可能です。逆に、obj.ModifyValue呼び出しは、遅延バインディングを使用し、VB Migration Partnerは呼び出されたメソッドが、1つまたは複数のByRefパラメータを取るかどうかを判断することができません。
In this scenario you can use the LateBoundProperties pragma to let VB Migration Partner know which late-bound members are to be considered as methods that take one or more ByRef parameters. Here’s how the pragma might be used in this specific example:
このシナリオでは、どの遅延バインディングメンバーが一つ以上のByRefパラメータをとるメソッドとしてみなされるということを、VB Migration Partnerに通知するために、LateBoundProperties プラグマを使うことができます。この特定の例で、プラグマをどのように使用するかを以下に示します:
Sub Test(ByRef lbl As Label, ByVal txt As TextBox, ByVal wi As Widget, ByVal obj As Object)
'## obj.LateBoundMethods "ModifyValues"
Set obj = wi
wi.ModifyValues lbl.Caption, txt.Text
obj.ModifyValues lbl.Caption, txt.Text
End Sub
which produces the following code:
そして以下のコードを生成します:
Sub Test(ByRef lbl As VB6Label, ByVal wi As Widget, ByVal obj As Object) Set obj = wi wi.ModifyValue(ByVal6(lbl.Caption), ByVal6(txt.Text)) obj.ModifyValue(ByVal6(lbl.Caption), ByVal6(txt.Text)) End Sub
Consider that the pragma’s first argument is actually a regular expression, which allows you to specify multiple methods in just one pragma. (This is necessary because you can associate only one LateBoundMethods pragma to a given variable.) Therefore you might write something like
プラグマの最初の引数は、実際には1つのプラグマで複数のメソッドを指定することができる、正規表現だと考えてください。(所定の変数に対し、ただ1つのLateBoundMethods プラグマを関連づけることができるので、必要になります。)よって、次のような記述になります。
'## obj.LateBoundMethods "^(ModifyValues|ProcessInfo)$"
or just assume that all exposed members are to be considered as methods that can modify their arguments:
あるいは、すべての公開されているメンバーが、それらの引数を変更できるメソッドとして考えられると仮定します:
'## obj.LateBoundMethods ".+"
The second optional argument of the LateBoundMethods pragma is a regular expression that is applied to the 0-based numeric index of the argument being analyzed. If omitted, this regex defaults to “\d+”, therefore all parameters are considered to be defined with ByRef. For example, if you knew that only the second argument of the Widget.ModifyValues method is defined with ByRef, you can avoid useless ByVal6 insertions using this pragma:
LateBoundMethods プラグマの2番目の任意の引数は、分析される引数の0から始まる数値インデックスに適用される正規表現です。省略された場合は、この正規表現のデフォルトは”\d+”となり、すべてのパラメータがByRefで定義されていると考えられます。例えば、Widget.ModifyValuesメソッドの2番目の引数だけがByRefとして定義されているのがわかっている場合、このプラグマを使用することで不要なByVal6の挿入を避けることができます:
'## obj.LateBoundMethods "ModifyValues", "^1$"
If just the 2nd and 3rd parameters are defined with ByRef you need this pragma:
2番目と3番目のパラメータがByRefで定義されている場合は、このプラグマを必要とします:
'## obj.LateBoundMethods "ModifyValues", "^(1|2)$"
and so on.
The third argument of the LateBoundMethods pragma allows you to apply the pragma to multiple variables and fields under the pragma’s scope, without having to specify a different pragma for each one of them. For example, consider the following VB6 code:
LateBoundMethods プラグマの3番目の引数は、個別に異なるプラグマを指定することなく、プラグマのスコープ下の複数の変数およびフィールドにプラグマを適用することができます。たとえば、次のVB6コードを御覧下さい:
Sub Test(ByVal obj As Object, ByVal obj2 As Object, ByVal obj3 As Object) Set obj = New Widget Set obj2 = New Widget Set obj3 = New Person obj.ModifyValues lbl.Caption, txt.Text obj2.ModifyValues lbl.Caption, txt.Text obj3.ModifyValues lbl.Caption, txt.Text End Sub
If both the Widget and Person classes expose a ModifyValues method that takes ByRef arguments, you might use the following pragma to affect all of them:
両方のWidgetクラスとPersonクラスが、ByRef引数を取るModifyValuesメソッドを公開する場合は、それらのすべてに影響を与える、次のプラグマを使用することが出来ます:
Sub Test(ByVal obj As Object, ByVal obj2 As Object, ByVal obj3 As Object)
'## LateBoundMethods "ModifyValues"
Set obj = New Widget
Set obj2 = New Widget
Set obj3 = New Person
obj.ModifyValues lbl.Caption, txt.Text
obj2.ModifyValues lbl.Caption, txt.Text
obj3.ModifyValues lbl.Caption, txt.Text
End Sub
However, if you don’t want to apply the pragma to obj3, you would be forced to specify a distinct pragma for obj and obj2. The pragma’s third argument allows you to write more concise code:
obj3にプラグマを適用したくない場合は、objとobj2に異なったプラグマを指定する必要があります。プラグマの3番目の引数で、より簡潔なコードを書くことができます:
'## LateBoundMethods "ModifyValues", "\d+", "^(obj|obj2)$"
Notice that VB Migration Partner applies the two regular expressions using the Regex.IsMatch method, therefore the following pragma wouldn’t achieve the intended effect:
VB Migration Partnerは、Regex.IsMatchメソッドを使用することで2つの正規表現を適用しています。したがって、以下のプラグマが意図された結果を得られないことに注意してください:
'## LateBoundMethods "ModifyValues", "\d+", "(obj|obj2)"
because it would also match the obj3 member name.
それはまた、obj3メンバー名を一致させるためです。
If the VB6 code consistently uses a naming convention for its late-bound members, the pragma’s second argument can be quite useful. For example, if all the Variant and Object variables that are meant to store a reference to an ADODB.Connection have a leading “conn” in their name, you might use the following pragma:
VB6のコードが、遅延バインディングのメンバーに一貫した命名規則を使用している場合は、そのプラグマの2番目の引数は非常に役に立ちます。例えば、ADODB.Connectionへの参照を格納する、すべてのVariantとObject変数の名前の先頭が、“conn”となっているなら、以下のプラグマを利用することが出来ます:
'## project:LateBoundMethods "Execute", "^1$", "^conn"
to indicate that the second argument (i.e. the RecordsAffected argument) of the Execute method can be modified on return from the call.
上記は、実行メソッドの2番目の引数(例:RecordAffected引数)がl呼び出しから戻る際に変更されうるということを意味します。
Finally, you can also change VB Migration Partner’s default behavior by considering all late-bound names as references to methods with ByRef arguments:
最後に、ByRef引数を持つメソッドへの参照として全ての遅延バインディング名を考慮することによって、VB Migration Partnerのデフォルトの動作を変更することが出来ます。
'## project:LateBoundMethods ".+", ".+"
or more simply with
より簡潔に
'## project:LateBoundMethods ".+"
Notice that a LateBoundMethods pragma with a narrow scope shadows all the LateBoundMethods pragmas at a broader scope. For example, the above project-level pragma doesn’t apply to methods where another LateBoundMethods pragma is defined.
スコープの狭いLateBoundMethods プラグマが、より広いスコープのLateBoundMethods プラグマに優先することに注意してください。 例えば、上記のプロジェクトレベルプラグマは別のLateBoundMethods プラグマが定義されるメソッドに適用されません。
Specifies which late-bound members should be considered as writable properties. The first propregex argument is a regular expression that specifies which member names are to be considered as the names of writable properties (use “.+” to indicate “all members”). The second parameter is optional and is considered as a regular expression that specifies which Variant and Object fields and variables the pragma applies to (if omitted, it defaults to “.+” and therefore all the fields and variables in the pragma’s scope are affected). This pragma can be applied to the project, file, method, and variable level:
このプラグマは、どの遅延バインディングのメンバーが書き込み可能なプロパティであるとみなすかを指定します。最初のpropregex引数は、どのメンバー名が書込み可能なプロパティ名とみなされるかを指定する正規表現です。(「すべてのメンバー」を示す場合、「.+」を使います。)第2のパラメータは任意で、プラグマがどのVariantとObjectのフィールドと変数をあてはめるかを指定する正規表現と考えてください。(省略された場合、デフォルトで「.+」となり、プラグマのスコープのすべてのフィールドと変数が影響を受けます。)このプラグマはProject、File、メソッド、変数レベルに適用できます。
' all the late-bound members in current project are to be considered as writable properties '## project:LateBoundProperties ".+"
This pragma becomes important in applications that use late-binding quite extensively and accounts for a subtle but important difference between VB6 and VB.NET. Under VB6, passing a writable property to a ByRef parameter of a method does not affect the property (because behind the scenes VB6 is actually passing the return value from the Property Get block). Vice versa, passing a writable property to a ByRef parameter does modify the property value on exiting the method under VB.NET.
このプラグマはかなり広範囲に遅延バインディングを使い、VB6とVB.NETの微妙であるが、重要な違いの主な原因となるアプリケーションでは重要になります。VB6では、メソッドのByRefパラメータに書き込み可能なプロパティを渡すのは、プロパティに影響を与えません。(実際には、VB6は裏で、「Property Get」ブロックの戻り値を渡しているからです。) 逆に、VB.NETでは、書き込み可能なプロパティをByRefパラメータへ渡すと、メソッドを出る時にプロパティの値を修正します。
Consider the following VB6 code:
以下のVB6コードを御覧ください。
Sub Test(ByVal lbl As Label, ByVal obj As Object) DoSomething lbl.Caption, obj.Caption End Sub Sub DoSomething(ByRef str As String) str = UCase(str): str2 = UCase(str2) End Sub
If no pragma is added, this is how VB Migration Partner translates the code to VB.NET:
プラグマが全く加えられない場合、VB Migration Partnerは以下のようなVB.NETコードに変換します:
Sub Test(ByVal lbl As VB6Label, ByVal obj As Object) DoSomething(ByVal6(lbl.Caption), obj.Caption) End Sub Sub DoSomething(ByRef str As String, ByRef str2 As String) str = UCase(str): str2 = UCase(str2) End Sub
As you see, VB Migration Partner knows how to work around this difference and correctly wraps the lbl.Caption property reference inside a ByVal6 method when calling the method. This is possible because the property is referenced using early-binding (i.e. the lbl member has a definite type) VB Migration Partner can detect that a writable property is being passed. Conversely, the obj.Caption member uses late binding and VB Migration Partner can’t decide whether Caption is a reference to a writable property and omits the necessary ByVal6 code.
ご覧のとおり、VB Migration Partnerはこの違いに対処するかを把握し、メソッドを呼び出す際に、正しくByVal6メソッド内にlbl.Captionのプロパティ参照を包含します。これはプロパティが初期バインディングを使用して参照されている(つまりlblのメンバーは、明確な型を持っている)為に可能であり、VB Migration Partnerは書き込み可能なプロパティが渡されていることを検出することができます。逆に、obj.Captionメンバーが遅延バインディングを使用し、VB Migration PartnerはCaptionが書込み可能なプロパティの参照かの判断が出来ず、必要なByVal6コードが省略されます。
In this scenario you can use the LateBoundProperties pragma to let VB Migration Partner know which late-bound members are writable properties. In this specific case you might use this pragma
このシナリオでは、どの遅延バインディングのメンバーが、書き込み可能なプロパティであるかをVB Migration Partnerに知らせるのにLateBoundProperties プラグマを使用できます。この特定のケースでは、このプラグマを使用する場合があります。
Sub Test(ByVal lbl As Label, ByVal obj As Object)
'## obj.LateBoundProperties "Caption"
DoSomething lbl.Caption, obj.Caption
End Sub
However, consider that the pragma’s first argument is actually a regular expression, which allows you to specify multiple properties in just one pragma. (This is necessary because you can associate only one LateBoundProperties pragma to a given variable.) Therefore you might write something like
プラグマの最初の引数は、実際には1つのプラグマで複数のプロパティを指定することができる、正規表現だと考えてください。(所定の変数に対し、1つのLateBoundProperties プラグマのみ結びつけることができるので、これが必要になります。)よって、最初の引数には以下のような記述になります。
'## obj.LateBoundProperties "^(Caption|Left|Top|Width|Height)$"
or just assume that all exposed members are to be considered as writable properties:
あるいは、すべての公開されているメンバーは、書き込み可能なプロパティであるとみなされると仮定してください:
'## obj.LateBoundProperties ".+"
The second optional argument of the LateBoundProperties pragma allows you to apply the pragma to multiple members under the pragma’s scope, without having to specify a different pragma for each one of them. For example, consider the following VB6 code:
LateBoundProperties プラグマの2番目の任意の引数は、プラグマのスコープ内の複数のメンバーに対し、個別にプラグマを指定することなくプラグマを適用することが出来ます。以下のVB6コードを御覧ください。
Sub Test(ByVal obj As Object, ByVal obj2 As Object, ByVal obj3 As Object) DoSomething obj.Caption, obj2.Caption, obj3.Caption End Sub
If you can assume that all three parameters represent a control you might use the following pragma to affect all of them:
3つの全てのパラメータが、コントロールを表していると想定できる場合、それらの全てに影響を与えるために、次のプラグマを使用することが出来ます。
Sub Test(ByVal obj As Object, ByVal obj2 As Object, ByVal obj3 As Object)
'## LateBoundProperties "Caption"
DoSomething obj.Caption, obj2.Caption, obj3.Caption
End Sub
However, if you don’t want to apply the pragma to obj3, you would be forced to specify a distinct pragma for obj and obj2. The pragma’s second argument allows you to write more concise code:
ただし、obj3にプラグマを適用したくない場合には、objとobj2へ個別にプラグマを指定する必要があります。プラグマの2番目の引数には、より簡潔なコードを書きます:
'## LateBoundProperties "Caption", "^(obj|obj2)$"
Notice that VB Migration Partner applies the two regular expressions using the Regex.IsMatch method, therefore the following pragma wouldn’t achieve the intended effect:
VB Migration Partnerは、Regex.IsMatchメソッドを使用する2つの正規表現を適用しています。したがって、以下のプラグマは意図された結果を得られないということに注意してください:
'## LateBoundProperties "Caption", "(obj|obj2)"because it would also match the obj3 member name.
なぜなら、obj3メンバー名を一致させるからです。
If the VB6 code consistently uses a naming convention for its late-bound members, the pragma’s second argument can be quite useful. For example, if all the Variant and Object variables that are meant to store a reference to an ADODB.Connection have a leading “conn” in their name, you might use the following pragma:
VB6のコードが、遅延バインディングのメンバーに一貫した命名規則を使用している場合は、プラグマの2番目の引数は非常に役に立ちます。例えば、ADODB.Connectionへの参照を格納する、すべてのVariantとObject変数の名前の先頭が、“conn”となっているなら、以下のプラグマを利用することが出来ます:
'## project:LateBoundProperties "(ConnectionString|CursorLocation)", "^conn"
Finally, you can also change VB Migration Partner’s default behavior by having all references to all late-bound members wrapped in ByVal6 method, as follows:
最後に、以下のように、参照される全ての遅延バインディングメンバーをByVal6メソッドで包むように、VB Migration Partnerのデフォルトの動作を変更することが出来ます:
'## project:LateBoundProperties ".+", ".+"
or more simply with
より簡潔にすると以下になります
'## project:LateBoundProperties ".+"
Notice that a LateBoundProperties pragma with a narrow scope shadows all the LateBoundProperties pragmas at a broader scope. For example, the above project-level pragma doesn’t apply to methods where another LateBoundProperties pragma is defined.
スコープの狭いLateBoundProperties プラグマが、より広いスコープのLateBoundProperties プラグマより優先されることに注意してください。 例えば、上記のプロジェクトレベルプラグマは別のLateBoundProperties プラグマが定義されるメソッドに適用されません。
Specifies which late-bound members should be considered as properties or methods that return a Variant value. The first propregex argument is a regular expression that specifies which member late-bound names can return a Variant value (use “.+” to indicate “all members”). The second parameter is optional and is considered as a regular expression that specifies which Variant and Object fields and variables the pragma applies to (if omitted, it defaults to “.+” and therefore all the fields and variables in the pragma’s scope are affected). The third Boolean parameter is also optional and should be set to True if the Variant being returned can be the special Empty value.
このプラグマは、どの遅延バインディングのメンバーが、Variant値を返すプロパティまたはメソッドと見なすべきかを指定します。最初のpropregex引数は、どの名前の遅延バィンディングのメンバーが、Variant値を返すことができるかについて指定する、正規表現です。(「すべてのメンバー」を指定する場合は、「.+」を使います。)第2のパラメータは任意で、プラグマがどのVariantとObjectのフィールドと変数をあてはめるかを指定する正規表現と考えてください。(省略された場合、デフォルトで「.+」となり、プラグマのスコープのすべてのフィールドと変数が影響を受けます。)第3のブールのパラメータも任意ですが、もどされるVariantに特別なEmpty値が設定される可能性がある場合、Trueを設定する必要があります。
' all the late-bound members in current project are to be considered as properties ' or methods that can return a Variant value '## project:LateBoundProperties ".+"
This pragma can be necessary to prevent a few runtime exceptions when working with VB6Variant values and therefore is always used together with a ChangeType pragma like this one:
このプラグマは、VB6Variant値を使用して動作させる際のいくつかのランタイムエラーを防止するために設定が必要な場合があります。よって、常に以下のようなChangeType プラグマと一緒に使用されます。
'## project:ChangeType Variant, VB6Variant
If the LateBoundVariantMembers pragma is used, all methods and properties (within the scope of the pragma) invoked in late-bound mode – that is, through an Object or VB6Variant variable – are assumed to return a VB6Variant value. In practice, this pragma causes the invocation to be wrapper inside a CVar6 method in the following cases:
LateBoundVariantMembersプラグマが使用されている場合、オブジェクトかVB6Variant変数を通過する遅延バインディングで起動された全てのメソッドとプロパティ(プラグマのスコープ内)がVB6Variant値を戻すとみなします。実際には、このプラグマは以下のケースのようなCVar6メソッド内部のラッパーになる起動を引き起こします。
Specifies whether a specific local variable (or all local variables in a method) must be merged with the first statement that assigns it a value. By default, VB Migration Partner merges a variable declaration with its first assignments only if the value being assigned is constant and if the variable isn’t used in any statement after the declaration and before the assignment. You can use this pragma to inform VB Migration Partner that it is safe to do the merge even if the value being assigned isn’t constant. For example, consider this VB6 code:
このプラグマは、特定のローカル変数(あるいはメソッド内のすべてのローカル変数)に値を割り当てる最初のステートメントにマージしなければならないかどうかを指定します。VB Migration Partnerのデフォルトの動作は、割り当てられている変数が定数で、かつ変数宣言後、割り当て前にどのステートメントでも使用されていない場合、最初の割り当ての変数宣言をマージします。割り当てられている値が定数でない場合でも、以下のプラグマを使用することで、VB Migration Partnerにマージをすることが安全であると通知することが出来ます。以下のVB6コードを御覧ください。
Sub Test(value As Integer) '## MergeInitialization Force Dim x As Integer, y As Integer x = value * 2 y = x * value * 3 ' ... End Sub
The values being assigned aren’t constant, therefore by default VB Migration Partner wouldn’t attempt to merge the declaration and the assignment statements. Thanks to the MergeInitialization pragma, the code generator produces the following code:
割り当てられている値は、定数ではありません。よって、デフォルトでは、VB Migration Partnerは宣言と代入文のマージを試みません。 MergeInitialization プラグマのおかげで、コードジェネレータは、以下のコードを生成します:
Sub Test(value As Short)
Dim x As Short = value * 2
Dim y As Short = x * value * 3
' ...
End Sub
Other possible values for this pragma are No (always disable the merging) or Yes (apply the merging if it is safe to do so). The Yes value represents the default behavior, but this setting can be necessary to override the effect of another MergeInitialization pragma with a broader scope:
このプラグマの他の設定できる値として、No(常に、マージしない)またはYes(安全であるならば、マージする)があります。Yesはデフォルトの動作を意味します。しかしこの設定はより広いスコープで使われるMergeInitialization プラグマの効果を無効にするために必要になります。
' Disable initialization merging for all variables except n1 '## MergeInitialization No '## n1.MergeInitialization Yes
Note:
in a method that contains one or more Gosub statements that are converted to separate methods because of a ConvertGosubs pragma, this pragma is ignored and the variable initialization merging feature is disabled.
ConvertGosubs プラグマによって、別々のメソッドに変換された1つ以上のGosubステートメントを含むメソッドでは、このプラグマは無視されます、そして、変数の初期化マージ機能は無効にされます。
Specifies whether the current project, class, method, property or variable must have a different name in the converted VB.NET application. It can be useful to avoid name clashes with reserved VB.NET keywords or names of .NET Framework classes and methods. Consider the following VB6 code:
このプラグマは、現在のプロジェクトか、クラスか、メソッドか、プロパティか変数が、変換後のVB.NETアプリケーションで異なる名前が必要であるかを指定します。このプラグマは、予約されたVB.NETキーワード、または.NET Frameworkのクラスの名前とメソッドの名前との衝突を避けるために役立つことがあります。次のVB6のコードを御覧ください。
' ... (inside the Console VB6 class) '## SetName ConsoleNET '## Id.SetName Identifier Public Id As String Sub AddHandler() '## SetName AddEventHandler ' End Sub Sub Test() Dim c As New Console c.Id = "abc" c.AddHandler End Sub
Here’s how the code inside the Test method is converted to VB.NET:
Testメソッド内のコードは、以下のようにVB.NETに変換されます:
Sub Test() Dim c As New ConsoleNET c.Identifier = "abc" c.AddEventHandler() End Sub
Specifies whether the indexes of the element of an array should be adjusted by a given value. The applytovariables argument is False if only constant indexes should be adjusted, True if all indexes should be adjusted; delta1 is the value that must be subtracted from the first index; delta2 and delta3 are the values that must be subtracted from the second and third index, respectively.
このプラグマは、配列の要素のインデックスが、所定の値によって調整すべきかどうか指定します。applytovariables引数には、定数インデックスのみを調整する場合はFalseを、すべてのインデックスが調整されるべきであればTrueを設定します。delta1は、最初のインデックスから減算する必要がある値です;delta2とdelta3は、それぞれ第2および第3のインデックスから減算する必要がある値です。
This pragma is typically used together with the ArrayBounds pragma. Consider the following VB6 code:
このプラグマは、通常、ArrayBounds プラグマと一緒に使用されます。次のVB6のコードを御覧ください。
Sub Test() '## ArrayBounds Shift '## primes.ShiftIndexes False, 1 Dim primes(1 To 10) As Integer primes(1) = 1: primes(2) = 2: primes(3) = 3: primes(4) = 5: primes(5) = 7 '## powers.ShiftIndexes False, 1 Dim powers(1 To 10) As Double powers(1) = 1 Dim i As Integer For i = LBounds(powers) + 1 To UBound(powers) powers(i) = powers(i - 1) * 2 Next End Sub
The ShiftIndexes pragmas ensure that the array elements whose index is constants are scaled by 1 when this code is converted to VB.NET:
ShiftIndexes プラグマは、このコードがVB.NETに変換されるとき、1でスケールされた定数であるインデックスをもつ配列要素であることを確実にします。
Sub Test() Dim primes(9) As Short primes(0) = 1: primes(1) = 2: primes(2) = 3: primes(3) = 5: primes(4) = 7 Dim powers(9) As Double powers(0) = 1 Dim i As Short For i = LBounds6(powers) + 1 To UBound6(powers) powers(i) = powers(i - 1) * 2 Next End Sub
In most cases, the first argument of the ShiftIndexes pragma is False, which prevents this pragma from affecting array elements whose index is a variable or an expressions, as it usually happens inside a loop. However, this isn’t a fixed rule and the value for the applytovariables argument actually depends on how the loop is defined. For example, consider a variations of the above code:
多くの場合、ShiftIndexes プラグマの最初の引数はFalseであり、ループの中で通常起こってしまう、インデックスが変数か式である配列の要素に影響を与えることから、このプラグマを防ぎます。しかしながら、これは固定規則ではありません、applytovariables引数の値は、実際にループがどう定義されるかに依存します。例えば、上のコードのバリエーションを考えてください。
'## powers.ShiftIndexes True, 1
Dim powers(1 To 10) As Double
powers(1) = 1
Dim i As Integer
For i = 2 To 10
powers(i) = powers(i - 1) * 2
Next
In this case the lower and upper bounds of the loop are constants and aren’t expressed in terms of LBound and UBound functions, therefore you need to pass True in the first argument of the ShiftIndexes pragma to adjust the indexes inside the loop. This is the generated VB.NET code:
この場合、ループの上限値と下限値は、定数であり、LBound関数およびUBound関数で表現されていないため、ループ内でインデックスを調整するShiftIndexes プラグマの最初の引数にTrueを渡す必要があります。以下は生成されたVB.NETのコードです。
Dim powers(9) As Double powers(0) = 1 Dim i As Short For i = 2 To 10 powers(i - 1) = powers(i - 1 - 1) * 2 Next
When dealing with a multi-dimensional array you need to pass more than two elements to the ShiftIndexes pragma, as in the following code:
多次元配列に対処する場合、以下のコードのように、ShiftIndexes プラグマに2つ以上の要素を渡す必要があります。
'## mat.ArrayBounds Shift
'## mat.ShiftIndexes False, 1, 2
Dim mat(1 To 10, 2 To 20) As Double
mat(1, 2) = 1: mat(2, 3) = 2
which is converted to VB.NET as follows:
これは次のようにVB.NETに変換されます:
Dim mat(9, 18) As Double mat(0, 0) = 1: mat(1, 1) = 2
Finally, notice that the delta values don’t have to be constants, as in this example:
最後に、以下の例のように、デルタ値を定数にする必要がないことに注意してください。
Sub Test(arr() As Double, firstEl As Integer, lastEl As Integer)
'## arr.ArrayBounds Shift
'## arr.ShiftIndexes True, firstEl
ReDim arr(firstEl To lastEl) As Double
arr(firstEl) = 1
End Sub
which is converted as follows:
これは次のように変換されます。
Sub Test(ByRef arr() As Double, ByRef firstEl As Short, ByRef lastEl As Short) ReDim arr(lastEl - (firstEl)) As Double arr(firstEl - firstEl) = 1 End Sub
Notice that this pragma, like all pragmas that can reference arrays, should be inserted immediately before the Dim statement that declares the array, rather than before the ReDim statement that actually creates the array. Pragmas inserted inside the method where the ReDim statement appears are ignored.
このプラグマは、配列を参照できる他のすべてのプラグマのように、実際に配列をつくるReDimステートメントの直前ではなく、配列を宣言するDimステートメントの直前に挿入されなければならないことに注意してください。プラグマは、挿入されたメソッド内部でReDimステートメントが現れた場合、無視されます。
Specifies that a fixed-length string must be converted as a VB6FixedString_NNN type instead of the VB6FixedString type. For example, the following VB6 code:
このプラグマは、固定長文字列がVB6FixedString型の代わりにVB6FixedString_NNN型として変換させるように指示します。以下のVB6コードを御覧ください。
'## name.SetStringSize 128
Dim id As String * 20, name * As String * 128
is converted to VB.NET as follows:
以下のようにVB.NETに変換します。
Dim id As New VB6FixedString(20) Dim id As New VB6FixedString_128
where the VB6FixedString_128 class is defined in the VisualBasic6.Support.vb file under the My Project folder.
VB6FixedString_128クラスはMy Projectフォルダ配下のVisualBasic6.Support.vbファイルに定義されます。
Specifies that the specified variable, field, property or method must be rendered with a different .NET type. It is useful to specify a type other than Object for Variant and Control variables. For example, the following VB6 code:
指定された変数、フィールド、プロパティ、メソッドが異なる.NETタイプにレンダリングされるように指示します。バリアントとコントロール変数のためのオブジェクト以外のタイプを指定するのに便利です。
'## m_Name.SetType String
'## Name.SetType String
Private m_Name As Variant
Property Get Name() As Variant
Name = m_Name
End Property
is translated to VB.NET as follows:
以下のようにVB.NETに変換します。
Private m_Name As String Public ReadOnly Property Name() As String Get Return m_Name End Get End Property
Notice that this pragma must have a nonempty scope.
このプラグマは必ずスコープを指定する必要があることに注意してください。
Specifies whether variables defined in modules must be decorated with the ThreadStatic attribute. This attribute is only useful when migrating VB6 DLLs that are meant to be used by free-threaded .NET clients, for example ASP.NET pages or COM+ server components. It serves to reduce the gap between the Single-Thread Apartment (STA) model used by VB6 and the free-thread model used by .NET:
このプラグマは、モジュールで定義された変数がThreadStatic属性を付与されるべきかどうかを指定します。この属性は、例えば、ASP.NETPagesやCOM+サーバーコンポーネントなど、フリースレッド化された.NETクライアントによって利用されるVB6DLLを移行する際にのみとても便利です。VB6で利用されるシングルスレッドアパートメント(STA)モデルと.NETで利用されるフリースレッドモデルの間のギャップを少なくする効果があります。
'## ThreadSafe
Public UserName As String
If previous code is inside a BAS module, then VB Migration Partner generates what follows:
もし前述のコードがBASモジュール内であれば、VB Migration Partnerは次のように生成します。
<ThreadStatic()> _ Public UserName As String
The ThreadStatic attribute forces the VB.NET compiler to allocate the UserName variable in the Thread-Local Storage (TLS) area, so that each thread sees and works with a different instance of the variable. This approach makes free-threading more akin to the STA model and avoid many subtle runtime errors due to concurrency and race conditions between threads.
属性はスレッドローカルストレージ(TLS)エリアのユーザーネーム変数を割り当てるためにVB.NETコンパイラに強制させます。よってそれぞれのスレッドは変数の異なるインスタンスをもった動作を行います。このアプローチはSTAモデルへのより同種のフリースレッド化を作成します。そしてスレッド間の並列処理と競合条件に起因するたくさんの微妙なランタイムエラーを回避します。
Specifies how to convert by-reference parameters that might be rendered using by-value semantics. The mode argument can be Yes (the ByVal keyword is used for the parameter unless an explicit ByRef keyword is present), Force (the ByVal keyword is used for the parameter, regardless of whether an explicit ByRef keyword is present), No (the parameter is translated as is):
このプラグマは、値による意味論を使用することでレンダリングされるかもしれない参照されるパラメータをどのように変換するかを指定します。mode引数はYes(ByValキーワードが明確なByRefキーワードで存在している場合を除いたパラメータで使われている場合)、Force(ByValキーワードが明確なByRefキーワードがあるかどうかに関わらず、パラメータで使われている場合)、No(パラメータがそのまま変換される場合)が指定できます。
'## project:UseByVal Yes
If the parameter is omitted, the Yes value is assumed.
パラメータがない場合はYesとしてみなされます。
Specifies whether fixed-length strings inside Type…End Type blocks must be converted to VB.NET. If the argument is True or omitted, fixed-length strings inside the pragma’s scope are converted as properties that take or return System.String values.
このプラグマは、Type…End Typeブロック内部の固定長文字列をVB.NETに変換されるように指示します。引数がTrueまたは省略された場合、プラグマのスコープ内の固定長文字列はSystemString値を取得または戻すプロパティとして変換されます。
'## testudt.UseSystemString
Specifies whether VB Migration Partner should attempt to convert old-styled Gosubs into calls to separate methods. The first boolean argument is True (or omitted) to enable this conversion; the second Boolean argument is True if you want to optimize the generated code so that parameters of the separate method are declared with ByVal if possible. This pragma can have project-, file-, or method-level scope. For example, consider the following VB6 code:
このプラグマは、VB Migration Partnerが古い形式のGosubsをメソッドを分割する呼び出しに変換するかどうかを指定します。最初のBoolean引数がTrue(または無し)を設定するとこの変換が有効になります。生成されるコードを最適化したい場合、第2のBoolean引数をTrueにすると、可能であれば、分割メソッドのパラメータがByValで宣言されます。このプラグマはスコープをプロジェクトレベル、ファイルレベル、またはメソッドレベルにすることが出来ます。以下のVB6コードを御覧ください。
Function GetValue(x As Integer) As Integer
'## ConvertGosubs True
On Error Resume Next
Dim s As String, name As String
s = "ABC"
name = "Code Architects"
GoSub BuildResult
Exit Function
BuildResult:
GetValue = x + Len(s) + Len(name)
Return
End Function
VB Migration Partner detects that the code that begins at the BuildResult label (a.k.a. the target label) can be safely refactored to a separate method, that receives four arguments. The result of the conversion is therefore:
VB Migration Partnerは、4つの引数を受け取ることができ、分割メソッドへ安全にリファクタリング可能なBuildResultラベル(別名ターゲットラベル)で始まるコードを見つけ出します。変換結果を御覧ください。
Public Function GetValue(ByRef x As Short) As Short Dim s As String Dim name As String On Error Resume Next s = "ABC" name = "Code Architects" Gosub_GetValue_BuildResult(x, GetValue, s, name) Exit Function End Function Private Sub Gosub_GetValue_BuildResult(ByRef x As Short, ByRef GetValue As Short, _ ByRef s As String, ByRef name As String) On Error Resume Next GetValue = x + Len6(s) + Len6(name) End Sub
Notice that the external method contains an On Error Resume Next statement, because the original GetValue method also contains this statement.
外部メソッドはOn Error Resume Nextステートメントを含むことに注意してください。その理由は元のGetValueメソッドもまたこのステートメントを含むためです。
All arguments to the new Gosub_GetValue_BuildResult method are passed by reference, so that the caller can receive any value that has been modified inside the method (as is the case with the GetValue parameter in previous example.) You can have VB Migration Partner optimize this passing mechanism and use ByVal if possible by passing True as the second argument to the ConvertGosubs pragma:
新しいGosub_GetValue_BuildResultメソッドに対する全ての引数は参照によって渡されます。そのため、呼び出し側は(前述のサンプルのGetValueパラメータを伴うケースがそうであるように)メソッドの内部で修正されたどんな値でもを受け取ることができます。ConvertGosubsプラグマの2番目の引数としてTrueを引き渡すことによって、VB Migration Partnerに受け渡しメカニズムを最適化させ、可能ならばByValを使用させることができます。
'## ConvertGosubs True, True
If this optimization is used in the above code, the separate method is rendered as follows:
この最適化が上述のコードに使用されるなら、分割メソッドは以下のように作成されます。
Private Sub Gosub_GetValue_BuildResult(ByVal x As Short, ByRef GetValue As Short, _ ByVal s As String, ByVal name As String) On Error Resume Next GetValue = x + Len6(s) + Len6(name) End Sub
If you don’t like the name that VB Migration Partner assigns to the automatically-generated method, you can easily change it by means of a PostProcess pragma:
もしVB Migration Partnerが自動的に生成されたメソッド名に割り当てた名称が気に入らない場合、PostProcess プラグマを使って簡単に変更することができます。
'## PostProcess "Gosub_GetValue_BuildResult", "AssignValueResult"
It is important to keep in mind that the conversion of a Gosub block of code into a separate method isn’t always possible. More precisely, VB Migration Partner can perform this conversions only if all the following conditions are met:
ソースコードのGosubブロックを分割メソッドにする変換はいつも可能というわけではないことを覚えておくことは重要です。より正確には、以下のすべての条件が満たされる場合にだけ、VB Migration Partnerはこの変換を実行できます。
If a method contains one or more labels that can’t be converted to a separate method, VB Migration Partner still manages to convert the remaining labels. In general, a label can be converted to a separate method if it neither references nor is referenced by a label that can’t be converted (for example, a label that is defined inside an If block or a label that doesn’t end with an unconditional Return statement.)
もしメソッドが分割メソッドに変換できないラベルをひとつ以上含んでいる場合、VB Migration Partnerは残りのラベルを変換しようとします。一般的に、参照しておらず、また変換できないラベルからの参照もなければ、そのラベルを分割メソッドに変換できます。(例えば、Ifブロックの内部で定義されたラベルや無条件Returnステートメントで終了しないラベルがそうです。)
Note:
in a method that contains one or more Gosub statements that are converted to separate methods, the variable initialization merging feature is disabled.
分割メソッドに変換されるGosubステートメントをひとつ以上含むメソッドでは、変数初期化マージ機能は無効となります。
Specifies whether VB Migration Partner must wrap references to default members inside calls to the special GetDefaultMember6 and SetDefaultMember6 methods defined in the language support library:
このプラグマは、VB Migration Partnerが、言語サポートライブラリで定義された特別なGetDefaultMember6メソッドとSetDefaultMember6メソッドの呼び出しの中のデフォルトメンバに対する参照をラッピングしなければならないかどうかを指定します。
'## Rem enable default member support for this class, except for the Test member '## DefaultMemberSupport '## Test.DefaultMemberSupport False
Specifies how VB Migration Partner must convert VB6 remarks that start with three consecutive apostrophes. By default they are prefixed by an additional apostrophe+space, so that the VB.NET compiler doesn’t mistakenly interpret them as XML remarks. You can use False for the argument to disable such automatic fix, which can be useful if you decide to insert VB.NET XML remarks right in the VB6 code:
このプラグマは、VB Migration Partnerが3つの連続したアポストロフィで始まるVB6コメントをどのように変換しなければならないかを指定します。デフォルトではそれらの先頭にはアポストロフィと空白があります。そのため、VB.NETコンパイラはXMLコメントと間違えることはありません。そのような自動的な修正を無効化にするために引数にFalseを指定することができます。それは、VB6コードにVB.NET XMLコメントを適切に挿入しようと思った場合に役立ちます。
'## project:FixRemarks False
Specifies whether And and Or VB6 keywords must be translated to AndAlso and OrElse VB.NET keywords. For example, the following code:
このプラグマは、AndとOrというVB6キーワードをAndAlsoとOrElseというVB.NETキーワードに変換しなければならないかどうかを指定します。下記のコードを御参照ください。
Sub Test(ByVal x As Integer) '## LogicalOps True If x < 0 And x > 100 Then Err.Raise 9 ' ... End Sub
The pragma can have project, class, and method scope, and can issued multiple times inside the same method, to selectively enable and disable this feature. For example, this VB6 code:
このプラグマはプロジェクト、クラス、メソッドをスコープとすることができ、この機能を有効にしたり無効にしたりするために、同じメソッド内に複数回発行することができます。以下のVB6コードを御参照ください。
'## LogicalOps True If x > 0 Or (x = 0 And y < 0) Then … '## LogicalOps False If x1 > 0 Or (x1 = 0 And y1 < 0) Then …
translates to:
これを変換すると以下のようになります。
If x > 0 OrElse (x = 0 AndAlso y < 0) Then … If x1 > 0 Or (x1 = 0 And y1 < 0) Then …
Specifies whether two or more nested Ifs are automatically merged into a single statement by means of an AndAlso operator. This pragma can have project, class, and method scope. The first argument can be True (default if omitted) or False, where the latter value can be used to override another pragma with broader scope. The includeParens optional argument is True (default if omitted) if you want to enclose individual expressions within parenthesis, or False to drop these parenthesis.
このプラグマは、二つ以上の入れ子になったIf文がAndAlso演算子で自動的にひとつのステートメントにマージされるかどうかを指定します。このプラグマはプロジェクトレベル、クラスレベル、メソッドレベルのスコープにすることができます。最初の引数はTrue(省略した場合の初期値)、またはFalseにすることができ、Falseはより広いスコープのほかのプラグマを無効にするために利用できます。任意のIncludeParens引数は、括弧で個々の語句を囲みたい場合はTrue(省略した場合の初期値)、これらの括弧を除去するにはFalseになります。
For example, consider the following code
例として、次のコードを御覧ください。
Sub Test(ByVal obj As Object, ByVal obj2 As Object)
'## MergeIfs True
If Not obj Is Nothing Then
If obj.Text = "" Then Debug.Print "Empty Text"
End If
If Not obj Is Nothing Then
If Not obj2 Is Nothing Then
If obj.Text = obj2.Text Then Debug.Print "Same text"
End If
End If
End Sub
This is how VB Migration Partner translates it to VB.NET
これがVB Migration PartnerがVB.NETに変換する方法です。
Sub Test(ByVal obj As Object, ByVal obj2 As Object) ' UPGRADE_INFO (#0581): Two nested If...End If blocks have been merged. If (Not obj Is Nothing) AndAlso (obj.Text = "") Then Debug.WriteLine("Empty Text") End If ' UPGRADE_INFO (#0581): Three nested If...End If blocks have been merged. If (Not obj Is Nothing) AndAlso (Not obj2 Is Nothing) AndAlso (obj.Text = obj2.Text) Then Debug.WriteLine("Same text") End If End Sub
You can further simplify the expression by dropping the parenthesis around each subexpressions, by using the following pragma:
さらに、次のプラグマを使用することにより、各語句の括弧を削除して式を簡素化することができます。
'## MergeIfs True, False
Notice that this optimization is disabled if there are one or more special pragmas between the two IF statements, including InsertStatement, ReplaceStatement, PreInclude and PostInclude.
この最適化は、二つのIfステートメントの間に特別なプラグマ、InsertStatement、ReplaceStatement,、PreIncludeやPostIncludeが含まれている場合に無効になりますのでご注意ください。
Specifies whether VB Migration Partner must generate code that provides better support for null propagation in expressions. For example, consider the following VB6 code:
このプラグマは、VB Migration Partnerが語句のNull伝播をより高度にサポートするコードを生成するかどうかを指定します。例えば、次のVB6コードを御覧ください。
'## NullSupport
Sub Test(name As Variant, city As Variant)
name = UCase(name) + Trim(city)
End Sub
and its VB.NET translation
変換されたVB.NETコードは以下になります。
Sub Test(ByRef name As Object, ByRef city As Object) name = UCase6(name) + Trim6(city) End Sub
Methods affected by this pragma are: Chr, CurDir, Environ, Error, Hex, LCase, LTrim, Mid, Oct, Right, RTrim, Space, and UCase. The corresponding method in the language support library has same name plus a “6” suffix.
このプラグマによる影響を受けるメソッドは、Chr、CurDir、Environ、Error、Hex、LCase、LTrim、Mid、Oct、Right、RTrim、Space、UCaseです。言語サポートライブラリの対応するメソッドは等しく”6”の添字がついた名前を持っています。
Includes a text file before the parsing process begins. The argument is the path to the text file that contains the text to be included. (It can be an absolute path or a path relative to the folder that contains the .vbp project file.). The argument never needs to be included in double quotes:
このプラグマは、構文解析プロセスが始まる前に、テキストファイルを含めます。引数は含めるべきテキストを含んでいるテキストファイルに対するパスです。(絶対パスまたはvbpプロジェクトファイルが含まれているフォルダに対する相対パスを使用することができます。)引数はダブルコーテーションで囲まれた記述である必要はありません。
'## PreInclude c:\includes\copyright.txt
If the includefile argument points to a non-existing file, no text is included and no migration warning is generated. The PreInclude pragma supports recursion, in the sense that the file being included can contain additional PreInclude pragmas, up to any nesting level. VB Migration Partner doesn’t allow circular references among include files.
Includefile引数が存在しないファイルを指す場合、テキストには何も含まれず、変換時のWariningも生成されません。PreIncludeプラグマは、そのファイルにさらにPreIncludeプラグマを含むことができるという意味で、入れ子内部まで再帰的に使用することができます。VB Migration Partnerは含まれるファイル間での循環参照を許容しません。
Keep in mind that you typically can’t use this pragma to include a standard CLS or BAS file, because such VB6 files contains hidden text and attributes that would be included in the wrong position and might deliver unexpected results or even crash VB Migration Partner. You use this pragma at your own risk.
通常、標準的なCLSやBASファイルを含めるのにこのプラグマを使えないことに注意してください。なぜなら、そのようなVB6ファイルは間違った場所に含まれている非表示のテキストや属性を含んでおり、予期しない結果になったり、VB Migration Partnerをクラッシュさせるかもしれないからです。このプラグマを利用する場合、自己の責任において使用してください。
A good use for this pragma is as a simple way for multiple project to share the same set of project-level pragmas. For example, let’s assume that you have to migrate ten VB6 projects that require the same set of PostProcess pragmas. Instead of copying the pragma text in each and every project, you can gather them in a text file and reference the text from inside any source file in each project:
このプラグマの上手な利用法は、プロジェクトレベルのプラグマの同じ組み合わせを共有する複数のプロジェクトに対して簡単な方法をとして利用することです。例えば、PostProcessプラグマの同じ組み合わせを必要とする10個のVB6プロジェクトを変換しなければならないと仮定しましょう。各プロジェクトすべてにプラグマのテキストをコピーする代わりに、ひとつのテキストファイルにそれらを集めることができ、それぞれのプロジェクトのソースファイル内部からテキストを参照することができます。
'## PreInclude c:\code\pragmas.txt
Notice, however, that in this specific case, the pragma.txt file can’t contain the special pragmas that must be parsed before the project itself and that are necessarily to be stored in the VBMigrationPartner.pragmas file. However, quite conveniently PreInclude pragmas are honored even inside *.pragmas files, therefore each folder might contain a VBMigrationPartner.pragmas file that contains only one line containing the PreInclude pragma pointing to the text file that contains the actual pragmas that are shared among multiple projects.
しかし、この特別なケースにおいて、pragma.txtファイルは、VBMigrationPartner.pragmasファイルに格納されている必要がありかつプロジェクト自身の前に解析されなければならない特別なプラグマを含めることはできません。しかし、非常に便利なPreIncludeプラグマは*.pragmasファイルの内部でさえ優先されます。そのため、各フォルダは、複数のプロジェクト間で共有される実際のプラグマを含むテキストファイルを指し示すPreIncludeプラグマを含むたった1行を含むVBMigrationPartner.pragmasファイルを含めることができます。
Applies a replace regular expression to the VB6 code before it is parsed. The first argument is the search regex pattern string. The second argument is the replace regex pattern and can reference match groups defined in the search pattern; it abides to the same syntax rules as the Regex.Replace method but it also recognizes character sequences such as \n (newline), \r (carriage return) and \t (tab). Backslash characters in the replace regex must be doubled (as in \\). The third argument is a Boolean value that specifies whether searches are case insensitive (if omitted, it defaults to True). The fourth argument is True if this pragma applies also to the .vbp file and to the hidden portion of an .frm or .ctl file, False (or omitted) if it applies only to the VB6 code that you see inside the code editor. The fifth argument is an optional regex pattern that can be used to precisely indicate the code regions to which the search pattern must be applied.
このプラグマは、解析される前にVB6のソースコードに対する正規表現の置換を適用します。最初の引数は、検索用の正規表現パターン文字列です。2番目の引数は置換用の正規表現パターンで検索パターンに定義された一致グループを参照することができます。つまり、それはRegex.Replaceメソッドと同じ構文規則に従いますが、\n(改行)、\r(キャリッジリターン)、\t(タブ)のような文字列も認識します。置換用の正規表現における\はふたつ(\\)でなければなりません。3番目の引数は、検索が大文字と小文字を区別しないかどうかを指定するブール値(省略時はTrue)です。4番目の引数は、このプラグマが.vbpファイルと、.frmや.ctlファイルの非表示領域に対して適用される場合はTrueであり、コードエディタ内で見えるVB6コードだけに適用する場合はFalse(または、省略)です。5番目の引数は、検索パターンが適用されなければならないコード領域を正確に示すのに使われる任意の正規表現パターンです。
For example, the following pragma pre-processes the VB6 code and converts all OLE_COLOR variables into plain Long variables:
例えば、以下のプラグマはVB6コードを事前処理して、すべてのOLE_COLOR変数を簡単なLong変数に変換します。
'## PreProcess "As OLE_COLOR\b", "As Long"
The following pragma renames a button named “AddHandler” into “btnAddHandler”, to avoid the problem caused by AddHandler being a reserved VB.NET keyword. In this case it is necessary to apply the pragma to the hidden portion of the file and to account for event names, where the control’s name is followed by an underscore
以下のプラグマは、VB.NETの予約語であるAddHandlerによって起こる問題を回避するために、“AddHandler”という名称のボタンを“btnAddHandler”という名称に変更します。このケースではアンダースコアが後に続くコントロール名の場所の、イベント名の記述とファイルの非表示領域にプラグマを適用する必要があります。
'## PreProcess "(\bAddHandler\b|(? < =\bSub\s+)AddHandler(?=_))", "btnAddHandler", True, True
The following example uses the optional regionpattern argument to restrict the action of the PreProcess pragma to Sub methods only:
以下の例ではSubメソッドにのみPreProcessプラグマの動作を制限する任意のregionpattern引数を使用します。
'## PreProcess "Dim ctrl As Control", "Dim ctrl As Object", False, _ False, "\bSub\b.+?\bEnd Sub\b"
Notice that the last argument uses the .+? pattern to ensure that the search region doesn’t extend to more than one method at a time.
最後の引数は、一度に一つ以上のメソッドに検索範囲が拡張しないことを保証するために、「.+?」パターンを使うことを覚えてください。
You can apply this pragma at the project-level only by storing it in a *.pragmas file – for example, in the Widgets.vbp.pragmas file for all the files in the Widgets.vbp project. An important note: this pragma can’t have a project: prefix: if the pragma appears in a source file it is implicitly scoped at the file level; if it appears in a *.pragmas file, it is implicitly scoped at the project level.
*pragmasファイルに格納することによって、プロジェクトレベルでこのプラグマを適用できます。(例:Widgets.vbpプロジェクト内の全てのファイルに適用する、Widgets.vbp.pragmasファイル)重要なこととして、このプラグマはProject:を接頭辞にすることはできません。プラグマがSourceファイル内に表示されている場合、それは暗黙的にファイルレベルでのスコープであり、*.pragmasファイルに表示されている場合、それは暗黙的にプロジェクトレベルでのスコープです。
Includes a text file after the conversion process has been completed. The argument is the path to the text file that contains the text to be included. (It can be an absolute path or a path relative to the folder that contains the .vbp project file.). The argument never needs to be included in double quotes:
このプラグマは、変換プロセスが完了した後に、テキストファイルを含んでいます。引数は含まれるべきテキストを含むテキストファイルへのパスです。(それは絶対パスまたはvbpプロジェクトファイルが含まれているフォルダへの相対パスを設定することができます。)引数は、二重引用符にて記述する必要はありません。
'## PreInclude c:\includes\copyright.txt
If the includefile argument points to a non-existing file, no text is included and no migration warning is generated. The PostInclude pragma supports recursion, in the sense that the file being included can contain additional PostInclude pragmas, up to any nesting level. VB Migration Partner doesn’t allow circular references among include files.
includefile引数が非存在ファイルを指定する場合、どのようなテキストも含まれません、そして、どのような移行警告も生成されません。PostInclude プラグマは再帰をサポートします、その意味は、含まれているファイルが、ネストレベルのPostInclude プラグマも含めることができるという意味です。VB Migration Partnerは含まれるファイルの中の循環参照を許容しません。
A good use for this pragma is to add one or more methods or classes to the resulting VB.NET code.
このプラグマの良い利用方法としては、1つ以上のメソッドやクラスを生成されるVB.NETコードに追加する場合に有効です。
Applies a replace regular expression to the VB.NET code generated by the migration process. The first argument is the search regex pattern string. The second argument is the replace regex pattern and can reference match groups defined in the search pattern; it abides to the same syntax rules as the Regex.Replace method but it also recognizes character sequences such as \n (newline), \r (carriage return) and \t (tab). Backslash characters in the replace regex must be doubled (as in \\). The third argument is a Boolean value that specifies whether searches are case insensitive (if omitted, it defaults to True). The fourth argument specifies whether the PostProcess pragma applies only to “hidden” files such as AssemblyInfo.vb and *.vbproj files (if omitted, it defaults to False and the pragma applies only to standard *.vb files, including *.Designer.vb files). The fifth argument is an optional regex pattern that can be used to precisely indicate the code regions to which the search pattern must be applied.
このプラグマは、移行プロセスによって生成されたVB.NETコードに正規表現を置き換えることを適用します。最初の引数は検索する正規表現パターン文字列です。2番目の引数は置換する正規表現パターンで、検索パターンに定義された該当するグループを参照することが出来ます。それは、Regex.Replaceメソッドと同じ構文規則に準拠します。しかしまたReplaceメソッドは\n(改行)、\r(キャリッジリターン)、\t(タブ)としてキャラクターシークウェンスを認識します。置換正規表現中のバックスラッシュキャラクターは2重記述でなければなりません(\\)。3番目の引数は、検索が大文字と小文字を区別するかどうか指定するブール値です(省略の場合、デフォルトはTrue)。4番目の引数は、PostProcess プラグマがAssemblyInfo.vbや*.vbprojファイルなどの「隠された」ファイルだけに適用するかどうか指定します。(省略の場合、デフォルトはFalse。プラグマは*.Designer.vbファイルを含む標準の*.vbファイルだけに適用されます)5番目の引数は、正確に、検索パターンを適用しなければならないコード領域を示すのに使用できる任意の正規表現パターンです。
For example, the following pragma changes the base form for the converted application:
以下のプラグマは変換されたアプリケーションについて標準のFormに変更する例です。
'## project:PostProcess "Inherits CodeArchitects.VB6Library.VB6Form", _ "Inherits AppFramework.FormBase", False, True
The search pattern can include match groups and you can reference these search groups in the replacement pattern. For example, the following pragma moves the declaration of the controlling variable into a For Each loop, if the variable is defined immediately before the loop:
検索パターンはマッチするグループを含むことができます。そして、置換パターンにこれらの検索グループを参照することができます。例えば、以下のプラグマは変数がループの直前に定義されている場合、コントロール変数の宣言をFor Eachループ内部に移動します。
'## PostProcess "Dim (?< name > \w+) As (?< type> \w+)( = .+)?\s+For Each \k< name > In", _ "For Each ${name} As ${type} In"
The following example is similar to previous one, except it uses the optional regionpattern argument to restrict the action of the PostProcess pragma only to Function methods named GetArray and GetString:
GetArrayとGetStringメソッドという名前の関数のメソッドに対してのみPostProcessプラグマの動作を制限するオプションregionpattern引数を使用する点を除き、以下の例は前の例と同様です。
'## PostProcess "Dim (?< name> \w+) As (?< type > \w+)( = .+)?\s+For Each \k < name > In", _ "For Each ${name} As ${type} In", False, False, _ "\bFunction (GetArray|GetString)\b.+?\bEnd Function\b"
Notice that the last argument uses the .+? pattern to ensure that the search region doesn’t extend to more than one function at a time.
最後の引数で使用されている。+?パターンは、検索領域を一度に複数の関数に拡張しないことに注意してください。
Specifies whether VB Migration Partner must take additional cure when converting custom properties. If Yes (or omitted) the pragma applies only to properties whose definition contains both a Property Let and a Property Set; if Force it applies to all properties that have a Property Let block, even if the Property Set block is missing. In all cases, the pragma applies only to properties whose Let block specifies a non-scalar data type.
このプラグマは、カスタムプロパティを変換するとき、VB Migration Partnerが追加対応を取らなければならないかどうか指定します。もし引数をYes(また省略)の場合、プラグマはProperty LetとProperty Setの両方を含む定義のプロパティにのみ適用します。Forceの場合、Property Setブロックがない場合であってもProperty Letブロックを持っているすべてのプロパティに適用されます。全てのケースにおいて、プラグマはLetブロックが非スカラデータ型を指定するプロパティのみに適用します。
'## DataResult.PreservePropertyAssignmentKind Yes
To understand when this pragma can be necessary, let’s consider the following VB6 code:
このプラグマがいつ必要になるかを理解するために、次のVB6を御覧下さい。
Private m_MyData As Variant Property Get MyData() As Variant If Not IsObject(m_MyData) Then MyData = m_MyData Else Set MyData = m_MyData End If End Property Property Let MyData(ByVal newValue As Variant) m_MyData = newValue ProcessDataValue newValue ' (ProcessDataValue is defined elsewhere) End Property Property Set MyData(ByVal newValue As Variant) Set m_MyData = newValue End Property Sub Main() Dim rs As New ADODB.Recordset, par As New ADODB.Parameter ' ... init the recordset here MyData = par Set MyData = par ' ... MyData = rs Set MyData = rs End Sub
This is how VB Migration Partner usually converts the above code:
VB Migration Partnerが通常どのように上記のコードを変換するかを示します。
Private m_MyData As Object Property MyData() As Object Get ' *** VB Migration Partner has simplified this code Return m_MyData End Get Set(ByVal newValue As Object) If Not IsObject6(newValue) Then m_MyData = newValue ProcessDataValue(newValue) ' (ProcessDataValue is defined elsewhere) Else m_MyData = newValue End If End Set End Property Sub Main() Dim rs As New ADODB.Recordset ' ... init the recordset here MyData = par.Value ' ** resolution of default property MyData = par ' ... MyData = rs.Fields ' ** resolution of default property MyData = rs End Sub
Notice that VB Migration Partner expands par into par.Value and rs into rs.Fields when the assignment to the MyData property lacks the Set keyword. While the two cases seem similar, they aren’t. The key different is that the ADODB.Parameter’s default property (Value) is a scalar value (a string, a number, a date, etc.) whereas the ADODB.Recordset’s default property (Fields) is an object.
MyDataプロパティへの割り当てがSetキーワードを欠いている際、VB Migration Partnerがrs.Fields内のrsとpar.Value内のparを拡張することに注意してください。二つのケースは似ておりますが、異なります。異なるキーポイントは、ADODB.Parameterのデフォルトのプロパティ(値)がスカラー値(文字列、数値、日付など)であるということですが、ADODB.Recordsetのデフォルトプロパティ(フィールド)はオブジェクトです。
When par.Value is assigned to the MyData property, the following statement
以下のステートメントのようにpar.ValueがMyDataプロパティに割り当てられます。
If Not IsObject6(newValue) Then
recognizes that it’s a scalar and executes the code block that was originally in the Property Let procedure (and therefore the ProcessDataValue method is correctly invoked). However, when rs.Fields is assigned to the MyData property, the test in the If statement finds that it’s not a scalar and mistakenly executes the code block that was originally in the Property Set procedure. As a result, the ProcessDataValue method isn’t invoked as it should have been.
それがスカラーであると認識し、元々のProperty Letプロシージャにあったコードブロックを実行します。(よって、ProcessDataValueメソッドは正しく呼び出されます。)しかし、rs.FieldsがMyDataのプロパティに割り当てられる際、Ifステートメントにおけるテストは、それがスカラーでないことを認識し、元々のProperty Setプロシージャにあったコードブロックを誤って実行します。結果として、それがそうあるべきであったとき、ProcessDataValueメソッドは呼び出されません。
(You can also omit the argument, because Yes is the default). You can solve this problem by applying the PreservePropertyAssignmentKind pragma to the MyData property, as follows:
(デフォルトはYesなので引数を省略することができます。)MyDataプロパティにPreservePropertyAssignmentKind プラグマを適用させることによって、この問題を解決することが出来ます。以下を御覧下さい。
'## MyData.PreservePropertyAssignmentKind Yes
In this case VB Migration Partner generates the following VB.NET code:
このケースにおいてVB Migration Partnerは以下のVB.NETのコードを生成します。
Private m_MyData As Object Property MyData(ByVal Optional _assignmentKind As PropertyAssignmentKind _ = PropertyAssignmentKind.Let) As Object Get ' *** VB Migration Partner has simplified this code Return m_MyData End Get Set(ByVal newValue As Object) If _assignmentMode = PropertyAssignmentKind.Let Then m_MyData = newValue ProcessDataValue(newValue) ' (ProcessDataValue is defined elsewhere) Else m_MyData = newValue End If End Set End Property Sub Main() Dim rs As New ADODB.Recordset ' ... init the recordset here MyData = par ' ** no resolution of default property MyData(PropertyAssignmentKind.Set) = par ' ... MyData = rs ' ** no resolution of default property MyData(PropertyAssignmentKind.Set) = rs End Sub
In this new version the task of determining whether the original assignment was performed by means of a Let or a Set is carried out by means of the _assignmentMode parameter. Being optional, the parameter is omitted when assigning using a “let” and is used only in “set” assignments, which helps generating less cluttered code.
この新しいバージョンでは、元の割り当てがLetかSetによって実行されたかどうか決定するタスクが_assignmentModeパラメタによって行われます。オプションなので、パラメタは、「let」を使用し割り当てる際に省略されます。そして「set」割り当てのみ使用された際にも省略されます。どちらにおいてもよりより整理されたコードを生成するのに役立ちます。
Notice that when this pragma is used, the default property isn’t expanded any longer and the newValue parameter receives the actual object being assigned, not its default property. This is exactly what the happens in VB6.
このプラグマが使用されている場合、デフォルトプロパティはこれ以上拡張されません。そして、newValueパラメタがデフォルトプロパティではなく、割り当てられる実際のオブジェクトを受けとることに注意してください。これはVB6でも同様な事象です。
By default, the pragma applies only to properties that have both a Property Let and a Property Set pragma. However, if you use Force as an argument, the pragma applies also to properties that have only the Property Let block (provided that the parameter for such block is Variant or a non-scalar type). In this case the PropertyAssignmentKind argument is generated but never used, and the pragma only has the effect of preventing VB Migration Partner from generating.
デフォルトで、プラグマはProperty LetとProperty Set プラグマの両方を持っているプロパティだけに適用されます。しかし、引数としてForceを使用する場合、(もしそのようなブロックのパラメタがVariant型か非スカラ型であるならば)プラグマはProperty Letブロックしか持っていないプロパティに適用されます。この場合、PropertyAssignmentKind引数は生成されますが、決して使用されません。そして、プラグマにはVB Migration Partnerの生成を防ぐという効果があるだけです。
Specifies a code generation option, depending on the argument passed in the first argument. Supported options are:
このプラグマは、コード生成オプションを指定します。最初の引数に渡される引数に依存します。サポートされるオプションは以下になります。
VariantContainsArray:
VB Migration Partner assumes that VB6Variant variables under the scope of this pragma may contain an array; as a result, when passing a VB6Variant variable to a ByVal VB6Variant parameter, the variable is wrapped in a CVar6 method, to ensure that the inner array is correctly cloned.
VB Migration Partnerは、このプラグマのスコープであるVB6Variant変数が配列を含むかもしれないとみなします。結果として、VB6Variant変数をByVal VB6Variantパラメタに引き渡す際に、変数が、内部配列が正しくクローン化されるのを保証するためにCVar6メソッドで包装されます。
FixedStringsAsStructures:
VB Migration Partner generates one member named “VB6FixedString_NNN” (where NNN is a number) for each fixed-length string that is used inside an array. By default such members are generated as classes, but if this parameter is True or omitted then the member is rendered as a strictire. (This option has been introduced in version 1.23 to preserve compatibility with older versions, which rendered those members as classes.) This option is always applied to the entire project, regardless of the specified scope.
VB Migration Partnerは配列の内部で利用されているそれぞれの固定長文字列に対し”VB6FixedString_NNN”(NNNの部分は数値)で命名されたひとつのメンバを生成します。デフォルトでそのようなメンバはクラスとして生成されます。しかし、このパラメータがTrueもしくは省略の場合、メンバは構造体としてレンダリングされます。(このオプションは、クラスとしてそれらのメンバーをレンダリングした旧来のVersionとの互換性を保持するためにVersion1.23で紹介されました。)このオプションは指定されたスコープにかかわらず常に全体のプロジェクトに適用されます。
RemarkMethodBody:
VB Migration Partner remarks out all the statements inside all properties and methods under the scope of this pragma, so that you can correctly resolve property/method references without having to fix individual statements that cause a compilation error. This pragma is especially useful to incrementally migrate large VB6 projects, one file at a time. You can specify this pragma at the project, file, and method level. (If applied at the variable level, this pragma is ignored.)
コンパイルエラー引き起こす個々のステートメントを修正する必要がないプロパティ/メソッド参照を正確に解決できるように、VB Migration Partnerはこのプラグマのスコープ下のすべてのプロパティとメソッド内部のすべてのステートメントをコメント記述します。このプラグマは、一度に1個のファイルが大きいVB6プロジェクトを徐々に移行するのに大いに役立ちます。プロジェクト、ファイル、メソッドレベルにこのプラグマを指定することができます。(変数レベルで適用する場合は、このプラグマは無視されます)
For example, the following pragmas force VB Migration Partner to generate fixed-length strings as structures and to remark all statements in all methods in the current project. Notice that you can omit the second argument if it is True:
例として、以下のプラグマは構造体としての固定長文字列を生成する、また現行プロジェクトの全てのメソッドの全てのステートメントをコメントアウトすることをVB Migration Partnerに指示します。それがTrueの場合、2番目の引数を省略できることに注意してください。
'## project:SetOption FixedStringsAsStructures, True '## project:SetOption RemarkMethodBody
ExcludeMethodBody:
VB Migration Partner excludes all statements inside methods and property procedures when parting the VB6 source code, but not method and property signatures (so that it can correctly resolve all references). This pragma is especially useful to incrementally migrate very large VB6 projects, one file at a time, to speed up the migration process of large files, and to avoid out-of-memory errors during the migration process. You can specify this pragma at the project, file, and method level. (If applied at the variable level, this pragma is ignored.)
メソッドとプロパティシグネチャではないVB6ソースコードを分割する際に、メソッドとプロパティプロシージャ内の全てのステートメントを除外します。(結果として全ての参照を正確に解決することができます。)このプラグマは、一度に1個のファイルがとても大きいVB6プロジェクトを徐々に移行するのに大いに役立ちます。また、大きいサイズのファイルの移行プロセスのスピードアップや移行プロセスにおいてのOutOfMemoryエラーを回避するのに役立ちます。プロジェクト、ファイル、メソッドレベルにこのプラグマを指定することができます。(変数レベルで適用する場合は、このプラグマは無視されます)
For example, the following pragmas force VB Migration Partner to exclude statements in all methods in the current project. Notice that you can omit the second argument if it is True:
例として、以下のプラグマは現行プロジェクトの全てのメソッドの全てのステートメントを除外することをVB Migration Partnerに指示します。それがTrueの場合、2番目の引数を省略できることに注意してください。
'## project:SetOption ExcludeMethodBody
When applied at the project level, the SetOption ExcludeMethodBody pragma must be included in a *.pragmas file.
プロジェクトレベルに適用する場合は、*.pragmasファイルの中にSetOption ExcludeMethodBody プラグマを含めなければなりません。
Specifies whether VB Migration Partner should attempt to convert error-handling code inside a method by means of structured error handling based on the Try…Catch block. The first optional argument can be True (or omitted) if you want to use structured exception handling, or False to suppress this feature (can be useful to override a UseTryCatch pragma with a broader scope. The second optional argument maxExecLines is the max number of executable statements in a method that contains an On Error Resume Next statement (default value is 2).
このプラグマは、VB Migration Partnerが、Try…Catchブロックに基づく構造化されたエラー処理によってメソッド内部でエラー処理コードを変換するのを試みるべきかどうか指定します。構造化された例外処理を使いたい場合、最初の任意の引数はTrue(または省略)に設定することができます。また、Falseにするとこの機能を無効にします。(より広範なスコープのUseTryCatch プラグマを無効にするのに便利です。)2番目の任意のmaxExecLines引数はOn Error Resume Nextステートメント(デフォルト値は2)を含むメソッド内の実行ステートメントの最大行数です。
Here’s an example of this pragma:
以下はこのプラグマの例です。
Sub Test() '## UseTryCatch On Error Goto ErrorHandler ' method body ErrorHandler: ' error handler End Sub
This is how the code is translated to VB.NET:
VB.NETにどのように変換されたかを以下に示します。
Sub Test() Try ' IGNORED: On Error Goto ErrorHandler ' method body Catch _ex As Exception ' IGNORED: ErrorHandler: ' error handler End Try End Sub
The Try…Catch block can be inserted only if the following conditions are all true:
Try…Catchブロックは以下の条件が全てTrueの場合にのみ挿入することができます。
For example, the following VB6 code:
以下のVB6コードを御覧下さい。
Sub Test() '## UseTryCatch On Error Goto ErrorHandler ' method body If x > 0 Then GoTo ErrorHandler2 ErrorHandler: ' error handler ErrorHandler2: ' do something here End Sub
can’t be converted to VB.NET using a Try-Catch block because a GoTo statement in the method body points to a label that is defined in the error handler.
Try-Catchブロックを使用するようにVB.NETに変換されません。メソッド本体のGoToステートメントがエラー処理で定義されたLabelを指すからです。
By default, VB Migration Partner inserts a Try-Catch also if the method contains the On Error Resume Next statement plus another executable statement. For example, the following VB6 code:
デフォルトで、メソッドがOn Error Resume Nextステートメントと別の実行ステートメントを含んでいるのであれば、VB Migration PartnerはTry-Catchを挿入します。以下のVB6コードを御覧下さい。
Function Reciprocal(ByVal x As Double) As Double '## UseTryCatch True On Error Resume Next Reciprocal = 1 / x ' returns zero if an error occurs (e.g. X is zero) End Function
contains only two executable statements (including On Error Resume Next) and is converted to:
たった2行の実行ステートメント(On Error Resume Nextを含む)を含んでおり、また、次のように変換されます。
Function Reciprocal(ByVal x As Double) As Double Try Return 1 / x ' returns zero if an error occurs (e.g. X is zero) Catch ' Do nothing if an error occurs End Try End Function
Methods with three or more executable statements can be converted using Try Catch if you specify a value higher than 2 in the second argument for the UseTryCatch pragma. For example, all methods with up to 5 executable statements under the scope of the following pragma:
UseTryCatch プラグマの2番目の引数に2よりも高い値を指定した場合は、3つ以上の実行ステートメントを持つメソッドはTry-Catchを使用する変換が行われます。例として、以下のプラグマのスコープ下に最大5行の実行ステートメントを持つ全てのメソッドがあります。
'## UseTryCatch True, 5
are converted using a Try-Catch block.
Try-Catchブロックを使用し、変換されます。
Important Note:
the UseTryCatch pragma can be used together with the AutoDispose Force pragma, in which case VB Migration Partner generates a complete Try-Catch-Finally block. However, for the VB.NET code to be perfectly equivalent to the original VB6 code it is essential that the On Error Goto statement be located at the very top of the method body.
UseTryCatch プラグマはAutoDispose Force プラグマと一緒に使用することができます。その場合、VB Migration Partnerは完全なTry-Catch-Finallyブロックを生成します。しかし、VB.NETコードが元のVB6コードに完全に対応しているので、On Error GoToステートメントがメソッド本体の最も上位の位置に配置されていることは必須となります。
Specifies whether VB Migration Partner must generate additional code to ensure that delegate objects passed to Declare statements aren’t orphaned during garbage collections:
VB Migration Partnerが、Declareステートメントに渡されたデリゲイトオブジェクトが、ガーベージコレクションの間に置き忘れられないように追加コードを生成するように指定します。
'## project:WrapDeclareWithCallbacks True
Changes the z-order of a control and brings it in front of all other controls. This pragma can be only scoped at the control level. When using this pragma for two or more controls on the same form, the last control becomes the topmost control:
このプラグマは、コントロールのz-orderを変更し、それを最前面に配置します。このプラグマはコントロールレベルのみスコープとすることができます。同一フォーム上の二つ以上のコントロールに対してこのプラグマを利用するときは、最後のコントロールが最前面のコントロールになります。
'## Rem bring the ListView1 in front of all other controls, except Text1 '## ListView1.BringToFront '## Text1.BringToFront
Modifies the value of a given property for all occurrences of a control of given name or type. The propertyname argument is the name of the property to be affected, newvalue is the new property value. The controltype argument is a regex that identifies the type of the controls to be affected and must match the complete name of the control’s type (e.g. “VB.TextBox”); if omitted, controls are affected regardless of their type. The controlname argument is a regex that identifies the name of the controls to be affected by the pragma; if omitted, all controls are affected regardless of their name. The propertyname, controltype, and controlname arguments are case-insensitive.
propertyname引数は変更するプロパティの名称、newvalueは新しいプロパティ値です。Controltype引数は、変更するコントロールの型を特定する正規表現です。またこの引数はコントロールの型の名称(例「VB.TextBox」)に完全に一致していなければなりません。省略した場合、コントロールはその型に関わらず影響を受けます。Controlname引数はプラグマによって影響を受けるコントロールの名称を特定する正規表現です。省略した場合、全てのコントロールはその名称に関わらず影響を受けます。Propertyname、Controltype、Controlname引数は大文字小文字を区別しません。
The pragma can have project or form project, therefore a single pragma can affect controls that are hosted in different forms; because the first two arguments are regexes, a single pragma can affect multiple controls of same or different type.
このプラグマはプロジェクトまたはFormプロジェクトを持つことができます。そのため、ひとつのプラグマで異なるformに配置されたコントロールに影響を与えることができます。すなわち、最初の2つの引数は正規表現なので、ひとつのプラグマで同じ型と異なる型の複数のコントロールに影響を与えることができます。
'## Rem all command buttons in current form whose name begins with "cmd" must be 400 twips high '## ChangeProperty Height, 400, "VB\.CommandButton", "cmd.+" '## Rem reset the Text property of all TextBox controls in all forms '## project:ChangeProperty Text, "", "VB\.TextBox"
The name of controls that belong to a control array include the index between parenthesis:
コントロール配列に属するコントロールの名称は括弧内のインデックスを含みます。
'## Rem reset the Text property for all the elements of the "txtFields" control array '## ChangeProperty Text, "", "VB\.TextBox", "txtFields\(\d+\)"
You can also perform math operations on the current property value, by prefixing the newvalue argument with the +, -, *, /, \ symbols:
+, -, *, /, \ 記号を伴うnewvalue引数によって、現在のプロパティ値に演算操作を実行することもできます。
'## Rem expand the width of all command buttons in current form by 200 twips '## ChangeProperty Width, +200, "VB\.CommandButton" '## Rem ensure that all textboxes on current form are multilined and double their height '## ChangeProperty Height, *2, "VB\.TextBox"
The newvalue argument can be preceded by the “=” symbol, which allows you to set a negative value for a numeric property or to assign a string property that begins with a math symbol:
newvalue引数は「=」記号の後に記述することができます。これによって、数値プロパティに負の値を設定したり、演算記号で始まる文字列プロパティを割り当てることができます。
'## Rem set the ListIndex property to -1 for all ListBox controls '## ChangeProperty ListIndex, =-1, "VB\.ListBox" '## Rem set the Caption property to "+1" for controls named "lblIncr" or "cmdIncr" '## project:ChangeProperty Caption, "=+1", , "(lblIncr|cmdIncr)"
Set the default font for a specific form or (if the pragma has project scope) all the forms in the application. The fontname argument is the name of the form (embedded in double quotes if contains spaces), the optional fontsize argument is the size of the font:
このプラグマは、特定のフォームや(プラグマがプロジェクトをスコープにしている場合には)アプリケーションの全てのフォームにデフォルトのフォントをセットします。fontname引数は(半角スペースを含む場合は二重引用符で囲まれた)フォームの名称であり、任意のFontsize引数はフォントのサイズです。
'## Rem set the default font for forms that don’t define a custom font '## project:FormFont Arial, 10
This pragma allows you to specify a different default font for forms; it affects only fonts that use the default font and don’t specify a specific font. If the fontsize argument is omitted, the original font size is retained.
このプラグマによって各フォームに対して異なる初期フォントを指定することができます。すなわち、デフォルトフォントを使っており、特定のフォントを指定しないフォントにのみに効果があります。fontsize引数を省略した場合はオリジナルのフォントサイズが適用されます。
Specifies whether VB Migration Partner should discard assign design-time assignments to properties that aren’t supported under VB.NET. Such properties are marked as obsolete in the control language library and, by default, they aren’t included in the converted project. If the argument is True or omitted, assignments to these properties are preserved in the converted VB.NET project:
このプラグマは、VB.NET下でサポートされていないプロパティに対して行われたデザイン時の設定をVB Migration Partnerに破棄させるべきかどうかを指定します。そのようなプロパティはコントロール言語ライブラリでは無視されるものと見なされており、デフォルトでは、それらは変換されたプロジェクトには含まれません。引数がTrueまたは省略された場合は、これらのプロパティの設定は変換されたVB.NETプロジェクトに引き継がれます。
'## KeepObsoleteProperties True
You can scope this pragma at the project, file, and individual control level. This pragma can be useful to browse all the properties that are usually discarded during the migration process.
このプラグマはプロジェクトレベル、ファイルレベル、個々のコントロールレベルをスコープとすることができます。このプラグマはマイグレーション工程で通常は破棄される全てのプロパティを閲覧するのに役立ちます。
Replace all occurrences of a font with another font, for all controls in current form or in all forms in current project (depending on the pragma’s scope):
“このプラグマは、(プラグマのスコープに従って)現在のフォームまたは現在のプロジェクトのすべてのコントロールに対して発見されたフォントを他のフォントに置き換えます。 ”
'## Rem replace all occurrences of MS Sans Serif with Helvetica font '## project:ReplaceFont "MS Sans Serif", "Helvetica"
VB.NET doesn’t support system fonts, a group which includes the following fonts: Courier, Fixedsys, Modern, MS Sans Serif, MS Serif, Roman, Script, Small Fonts, System, and Terminal. Because of this limitation, VB Migration Partner converts Courier and Fixedsys fonts to Courier New and all other fonts to Arial, while preserving the font size. You can use this pragma to enforce a different substitution schema.
VB.NETは次のフォントを含むグループとシステムフォントとをサポートしません。すなわち、Courier、Fixedsys、Modern、MS Sans Serif、MS Serif、Roman、Script、Small Fonts、System、Terminalです。この制約によって、VB Migration PartnerはCourierとFixedsys フォントはCourier Newに、その他のフォントはArialに変換します。しかしながら、フォントサイズは引き継がれます。異なる置換計画を実施するために、このプラグマを使用することができます。
Replaces all occurrences of a font/size combination with a different font/size combination, for all controls in current form or in all forms in current project (depending on the pragma’s scope):
このプラグマは、(プラグマのスコープに従って)現在のフォームまたは現在のプロジェクトのすべてのフォームのすべてのコントロールに対して、発見されたすべてのfont/sizeの組み合わせを異なるfont/sizeの組み合わせに置換します。
'## Rem replace all occurrences of MS Sans Serif 12 with Helvetica 10 font '## project:ReplaceFont "MS Sans Serif", 12, "Helvetica", 10
See the ReplaceFont pragma for more information on the automatic font replacement mechanism that VB Migration adopts.
VB Migration Partnerが採用する自動フォント置換機構に関する詳細はReplaceFontプラグマを参照してください。
Changes the z-order of a control and sends it behind all other controls. This pragma can be only scoped at the control level. When using this pragma for two or more controls on the same form, the first control becomes the bottommost control:
このプラグマは、コントロールのz-orderを変更し、他のすべてのコントロールの後ろにそれを配置します。このプラグマはコントロールレベルのみスコープとすることができます。同じフォームの2つ以上のコントロールにこのプラグマを使用する際、最初のコントロールは最背面のコントロールになります。
'## Rem send the ListView1 behind all other controls, except Text1 '## Text1.BringToFront '## ListView1.BringToFront
Assigns a design-time property to the current form or to a specific control:
このプラグマは、デザイン時のプロパティを現在のフォームや特定のコントロールに割り当てます。
'## Rem change the caption of current form '## WriteProperty Text, ".NET Framework options" '## Rem set the DTPicker1.Format property equal to 2 '## DTPicker1.WriteProperty Format, 2
This pragma is useful in many cases, for example to manually assign a control property that VB Migration Partner can’t migrate correctly (as is the case of the DTPicker’s Format property) or to purposely introduce minor differences between the VB6 and VB.NET applications.
このプラグマは多くのケースにおいて役立ちます。例えば、(DTPickerのFormatプロパティのように)VB Migration Partner が正しく変換できないコントロールプロパティを手作業で割り当てる場合や、VB6とVB.NETアプリケーション間のわずかな仕様の違いを意図的に比較する場合です。
Specifies a list of properties that have a different name in the .frm file. The propertylist argument is a comma-delimited list of oldname=newname pairs, as in this example:
このプラグマは、.frmファイル内の異なる名称を持つプロパティのリストを指定します。propertylist引数は古い名称=新しい名称のカンマ区切りのリストで、次のようになります。
'## TranslateProperties "FC=ForeColor,BC=BackColor"
When storing properties in a .frm file, VB6 doesn’t necessarily use the property name; more precisely, the actual name used in the .frm file is equal to the name specified when saving the value in the WriteProperties event handler. If the name specified in the event handler is different from the property name, you should use this pragma to tell VB Migration Partner which name is used in .frm files.
.frmファイルにプロパティを保存する場合、VB6は必ずしもプロパティ名称を必要としません。より正確には、.frmファイルで使用されている実際の名称はWritePropertiesイベントハンドラの値を保存する際に指定される名称と同じです。イベントハンドラで指定された名称がプロパティ名称と異なる場合、.frmファイルで使用される名称をVB Migration Partnerに伝えるためにこのプラグマを利用するべきです。
This pragma can’t have a scope prefix and is implicitly scoped at the file level. It is ignored if it appears in a VB6 file other than a .ctl (user control ) class.
このプラグマはスコープを持つことができず、暗黙的にファイルレベルをスコープとします。(ユーザコントロールの).ctlクラス以外のVB6ファイルに存在する場合は無視されます。
Specifies a list of events that must be renamed when migrating a UserControl class. The eventlist argument is a comma-delimited list of oldname=newname pairs, as in this example:
このプラグマは、ユーザコントロールのクラスを変換する際に、名前を変更しなければならないイベントのリストを指定します。eventlist引数は古い名称=新しい名称のカンマ区切りのリストで、次のようになります。
'## TranslateEvents "KeyPress=KeyPress6,KeyDown=KeyDown6,KeyUp=KeyUp6"
When this pragma is used, VB Migration Partner marks the converted UserControl class with a TranslateEvents attribute. In turn, this attribute is taken into account when VB Migration Partner converts any VB6 form that contains one or more instances of the user control. Renaming an event is sometimes necessary because the original name used under VB6 conflicts with events exposed by the .NET UserControl class.
このプラグマが使用される場合、VB Migration PartnerはTranslateEvents属性をもつ変換済みユーザコントロールクラスを識別します。言い換えると、ユーザコントロールのひとつ以上のインスタンスを含んでいるVB6FormをVB Migration Partnerが変換する際にこの属性が考慮されます。VB6で使用される元のイベントの名称が.NETユーザコントロールのクラスが公開しているイベントと衝突することがある場合、イベントの名称を変更しなければなりません。
This pragma can’t have a scope prefix and is implicitly scoped at the file level. It is ignored if it appears in a VB6 file other than a .ctl (user control ) class.
このプラグマはスコープを持つことができず、暗黙的にファイルレベルをスコープとします。(ユーザコントロールの).ctlクラス以外のVB6ファイルに存在する場合は無視されます。
Specifies a list of properties and methods that should be ignored when translating a VB6 user control. The memberlist argument is a pipe-delimited list of member names:
このプラグマは、VB6ユーザコントロールを変換する際に、無視されるべきプロパティとメソッドのリストを指定します。memberlist引数は「|」で区切られたメンバ名称のリストです。
'## IgnoreMembers "Appearance|Bindings|CompanyName"
This pragma can’t have a scope prefix and is implicitly scoped at the file level. It is ignored if it appears in a VB6 file other than a .ctl (user control ) class.
このプラグマはスコープを持つことができず、暗黙的にファイルレベルをスコープとします。(ユーザコントロールの).ctlクラス以外のVB6ファイルに存在する場合は無視されます。
Note:
This group of pragmas allow you to control how VB Migration Partner parses VB6 statements or outputs VB.NET code. None of these pragmas can have a scope, because they have an immediate effect on the code that follows.
このプラグマグループはVB Migration PartnerがどのようにVB6ステートメントを解析するか、どのようにVB.NETコードを出力するのかを制御するためのものです。次に示すようにコードに対して直接効果を持つのでこれらのプラグマはスコープを持つことができません。
Inserts a statement in the converted application. The code argument is an (unquoted) string that represents a valid VB.NET statement (or statements):
このプラグマは、変換されたアプリケーションにステートメントを挿入します。code引数は有効なVB.NETステートメント(あるいは複数のVB.NETステートメント)を表す(引用符で閉じられた)文字列です。
'## InsertStatement MsgBox6("End of processing"): Exit Sub
Inserts an UPGRADE_NOTE remark in the converted VB.NET:
このプラグマは、変換されたVB.NETにUPGRADE_NOTEコメントを挿入します。
'## Note Double-check following statement
x = Abs(y) Mod y
Sets VB Migration Partner’s output mode. The mode argument can be one of the following: On (enables code generation), Off (disable code generation), Remarks (generate remarked out code)), Uncomment (removes a leading apostrophe). The count argument is the number of VB.NET statements affected by this pragma; if zero or omitted, the effect extends to the next OutputMode pragma:
このプラグマは、VB Migration Partnerの出力モードを設定します。Mode引数は次の中のひとつを設定することができます。すなわち、(コード変換を有効にする)On、(コード変換を無効にする)Off、(コメント化されたコードを生成する)Remarks、(先頭のアポストロフィを削除する)Uncommentです。Count引数はこのプラグマの効果が及んだVB.NETステートメントの行数です。0もしくは省略された場合、その効果は次のOutputModeプラグマまで拡張されます。
'## Rem don’t output the next line (two statements, counting the remark) '## OutputMode Off, 2 PrintReport "Products", 1, 10 ' print pages 1-10 of the Products Report '## Rem don’t output the next method '## OutputMode Off Private Sub TestReport() ' ... (any number of lines here) ' ... End Sub '## OutputMode On
The Uncomment setting is especially useful for including a portion of VB.NET code that doesn’t exist in the original VB6 project:
Uncomment設定は元のVB6プロジェクトに存在しないVB.NETコードの一部を含めるのに特に役立ちます。
'## OutputMode Uncomment '' This is a piece of VB.NET code 'Debug.Print("x={0}", x) ' ... ' ... '## OutputMode On
Sets VB Migration Partner’s parsing mode. The mode argument can be one of the following: On (enables parsing), Off (disable parsing), Remarks (consider next statements as remarks). The count argument is the number of VB6 statements affected by this pragma; if zero or omitted, the effect extends to the next ParseMode pragma:
このプラグマは、VB Migration Partnerの解析モードを設定します。mode引数は次のひとつを設定できます。すなわち、(解析を有効にする)On、(解析を無効にする)Off、(次のステートメントをコメントと見なす)Remarks。count引数はこのプラグマの効果が及ぶVB.NETステートメントの行数です。0もしくは省略された場合、その効果は次のParseModeプラグマまで拡張されます。
'## Rem don’t parse the next line (two statements, counting the remark) '## ParseMode Off, 2 PrintReport "Products", 1, 10 ' print pages 1-10 of the Products Report '## Rem don’t parse the next method '## ParseMode Off Private Sub TestReport() ' ... (any number of lines here) ' ... End Sub '## ParseMode On
Notice the subtle difference between OutputMode and ParseMode pragmas. If parsing is enabled when a variable or method is parsed, VB Migration Partner creates a symbol for that method and correctly solves all references to it; if parsing is disabled, no symbol can be created, which prevents VB Migration Partner from correctly resolving references to that symbol.
OutputModeとParseModeプラグマには微妙な違いがあることに注意して下さい。変数かメソッドが解析される際に解析が有効な場合、VB Migration Partnerはそのメソッドの記号を作成し、それに対する参照を正しく解決します。解析が無効の場合、記号は作成されません。そのためVB Migration Partnerはその記号に対する参照を正確に解決することはできません。
If you don’t want to include a VB6 member in the VB.NET program, in most cases it is preferable to have VB Migration Partner parse the symbol and then use an OutputMode pragma to omit it during the code generation phase.
VB.NETプログラムにVB6メンバを含めたくない場合、ほとんどすべてのケースにおいて、コード生成工程では、VB Migration Partnerに記号を解析させた後、それを省略するのにOutputModeプラグマを使用するのが望ましいです。
Replace the following line of VB6 code with a different line. The replacement is performed before the parsing takes place, therefore you can use this pragma to change the way a method is declared, the scope of a variable, and so forth:
このプラグマは、次のVB6コードの行を異なる行に置き換えます。解析が実行される前に置換が実行されます。そのため、メソッドが宣言される方法、変数のスコープなどを変更するのにこのプラグマを使用することができます。
'## ParseReplace Sub Test(Optional Byval arg As Integer = -1)
Sub Test()
Notice that this pragma replaces an entire line of code, therefore it can replace multiple statements if the next line contains multiple statements. It can even replace a portion of a statement if the next line has a trailing underscore.
このプラグマはコードの全ての行を置き換えることに注意して下さい。そのため、次の行が複数のステートメントを含む場合は、複数のステートメントを置換することができます。次の行がアンダースコアを含んでいる場合、ステートメントの一部を置き換えることさえできます。
Inserts a remark in the VB6 source code that won’t be translated to VB.NET. This pragma is useful to explain what other pragmas do:
このプラグマは、VB.NETに変換されないVB6ソースコードにコメントを挿入します。このプラグマは他のプラグマがすることを説明するために役立ちます。
'## Rem we use the Shift option to preserve number of array elements
'## arr.ArrayBounds Shift
Dim arr(1 To 10) As Integer
Determines how unreachable code blocks are processed. The mode argument can be one of the following three values: Off (unreachable code is left in the generated VB.NET code, the default behavior), On or omitted (unreachable code is removed from the generated VB.NET code), Remarks (unreachable code is remarked out.) Consider the following VB6 code:
このプラグマは、参照されないコードブロックをどのように処理するかを指定します。mode引数は以下の3つの値のひとつにすることができます。すなわち、(デフォルトであり、生成されたVB.NETコードに参照されないコードを残す)Off、(参照されないコードを生成されたVB.NETコードから除外する)Onまたは省略、(参照されないコードをコメントにする)Remarksです。以下のVB6コードを御覧下さい。
'## RemoveUnreachableCode Remarks
Sub Test(x As Long, y As Long)
x = 123
Exit Sub
x = 456
y = 789
End Sub
This is the VB.NET code that VB Migration Partner generates:
以下はVB Migration Partnerで生成されたVB.NETコードです。
Sub Test(ByRef x As Integer, ByRef y As Integer)
x = 123
Exit Sub
'## UPGRADE INFO (#06F1): Unreachable code removed
' EXCLUDED: x = 456
' EXCLUDED: y = 789
End Sub
If the VB6 code had included the followed pragma:
VB6コードが以下のプラグマを含んでいる場合、
'## RemoveUnreachableCode On
then the result would have been as follows:
結果は以下のようになります。
Sub Test(ByRef x As Integer, ByRef y As Integer)
x = 123
Exit Sub
'## UPGRADE INFO (#06F1): Unreachable code removed
End Sub
Notice that current version of VB Migration Partner might, under some conditions, fail to recognize a piece of code as unreachable. This happens, for example, when a label is referenced by a piece of code that is unreachable. Consider the following code snippet
現在のバージョンのVB Migration Partnerはある条件の下では、参照されないコードの一部を識別することに失敗するかもしれないことに注意して下さい。この事例として、あるラベルが、参照されないコードの一部によって参照されている場合があります。以下のコードの切り抜きを御覧下さい。
Sub Test(ByRef x As Integer, ByRef y As Integer)
x = 123
Exit Sub
Restart:
' ...
If x = 10 Then Goto Restart
End Sub
The block of code between Exit Sub and End Sub is unreachable and should be removed. However, the Restart label is referenced by the GoTo statement in the unreachable portion of the method, and this detail cheats VB Migration Partner into believing that the label is indeed reachable. We are aware of this limitation and hope to work around it in a future release of the tool.
Exit SubとEnd Subの間のコードブロックは参照されていないので、削除されるべきです。しかし、Restartラベルは参照されないメソッドの一部のGoToステートメントによって参照されています。また、この部分によってVB Migration Partnerはラベルが参照されていると誤解してしまいます。弊社ではこの変換の制約を認識しており、将来のリリースでは解決できればと考えております。
Determines how unused members blocks are processed. The first argument can be one of the following three values: Off (unused members are left in the generated VB.NET code, the default behavior), On or omitted (unused members are removed from the generated VB.NET code), Remarks (unused members are remarked out.) The second argument is True if the pragma must affect only members that can’t be reached via late binding. Consider the following VB6 code:
このプラグマは、利用されないメンバブロックの処理の方法を指定します。第1引数は、以下の3つの値のうちの1つになりえます。つまり、(デフォルトであり、利用されないメンバが作成されたVB.NETコードに含まれない)Off、(利用されないメンバが作成されたVB.NETコードから削除される)Onまたは省略、(利用されないメンバをコメントする)Remarksです。第2引数は、プラグマが、遅延バインディングによってアクセスできないメンバだけに効果を与える場合に、Trueとなります。以下のVB6コードをご参照下さい:
Const UnusedValue As Integer = 1
If the constant is never referenced, VB Migration Partner generates the following message:
定数が参照されない場合は、VB Migration Partnerは、以下のメッセージを出します。
' UPGRADE_INFO (#0501): The 'UnusedValue' member isn’t used anywhere in current application
Const UnusedValue As Integer = 1
If you use a RemoveUnusedMembers pragma, the message is different. For example:
RemoveUnusedMembersプラグマが使用される場合、メッセージが異なります。例えば、
'## RemoveUnusedMembers Remarks
Const UnusedValue As Integer = 1
generates this VB.NET code:
以下のVB.NETコードが生成されます:
' UPGRADE_INFO (#0701): The 'UnusedValue' member has been remobed because ' isn't used anywhere in current application ' EXCLUDED: Const UnusedValue As Integer = 1
If the On option is used, the warning message is emitted but the member itself is removed. You need a DisableMessage pragma to drop the warning.
Onオプションが使用されると、警告メッセージが発行されますが、メンバは削除されます。警告メッセージを解除するにはDisableMessageプラグマが必要となります。
When applied to methods, the RemoveUnusedMembers pragma used with the Remarks disables a few other refactoring features, for example the ConvertGosubs pragma. In other words, if the following pragmas are active:
メソッドに適用する場合、Remarksを伴うRemoveUnusedMembersプラグマは、例えばConvertGosubsプラグマのような他のリファクタリング機能を無効にします。つまり、以下のプラグマがアクティブな場合、
'## RemoveUnusedMembers Remarks '## ConvertGosubs '## UseTryCatch
then VB Migration Partner generates (remarked out) nonoptimized VB.NET code, where Gosub keywords are not rendered as separate methods and On Error statements are not converted into Try-Catch blocks.
VB Migration Partnerは、最適化されていないVB.NETコードを(コメントにして)生成し、そこではGosubのキーワードは独立したメソッドとして変換されず、On ErrorステートメントはTry-Catchブロックに変換されません。
Important note:
the RemoveUnusedMembers pragma deletes or remarks all members that haven’t found to be referenced by any other member in the current project or other projects in the current solution. However, this mechanism can lead to unwanted removal if the member is part of a public class that is accessed by another project (not in the solution) or if the member is accessed via late-binding. You can use the MarkAsReferenced or MarkPublicAsReferenced pragmas to account for the first case.
RemoveUnusedMembersプラグマは、現ソリューションでの、現行のプロジェクトや他のプロジェクトにおけるどのメンバにも参照されていない全てのメンバを削除するか、あるいはコメントにします。しかし、メンバが、(別のソリューションの)他のプロジェクトからアクセスされるパブリッククラスのメンバであった場合や、メンバーが遅延バインディングによってアクセスされた場合は、このメカニズムは、不要な削除を実行するかもしれません。MarkASReferencedやMarkPublicAsReferencedプラグマを前者のケースを解決するために使用することができます。
However, there is no simple way to detect whether a member is accessed via late-binding. For this reason the RemoveUnusedMembers pragma supports a second safeMode parameter. If this parameter is True then the pragma affects only members that can’t be reached via late-binding, e.g. constants, Declare statements, and members with a scope other than public.
しかし、メンバが遅延バインディングによってアクセスされたかを確認する簡単な方法はありません。その為、RemoveUnsedMembersプラグマは、2番目のsefeModeパラメータをサポートします。このパラメータがTrueであると、例えば、定数や、Declareステートメント、パブリック以外のスコープにあるメンバのように、遅延バインディングによってアクセスできないメンバにのみプラグマは効果があります。
Replaces the next statement with a piece of code. The code argument is an (unquoted) string that represents a valid VB.NET statement (or statements):
このプラグマは、次のステートメントをコードの一部に置換します。このcode引数は有効なVB.NETステートメント(あるいは複数のVB.NETステートメント)を表す(引用符で閉じられた)文字列です。
'## ReplaceStatement Dim obj As Widget = Widget.Create(12)
Dim obj As New Widget
Keep in mind that this pragma replaces only the VB6 statement (not the line) that follows immediately the pragma. If the following line includes two statements separated by a semicolon, only the first statement is replaced by this pragma.
このプラグマが、直後にこのプラグマが続く(行ではない)VB6のステートメントだけを置換することに留意して下さい。もし、以下のラインがセミコロンで分離されている2つのステートメントを含む場合は、最初のステートメントのみがこのプラグマによって置換されます。
Note:
This group of pragmas allow you to select which upgrade messages are generated during the migration process. VB Migration Partner can generate issue, warning, info, and to-do messages and, by default, all of them are included as remarks in the converted VB.NET application. You can selectively disable and enable messeges by their ID, by their severity (Issue, Warning, Info, ToDo), and type (Syntax, Language, CodeAnalysis, Library)
このグループのプラグマによって、どのアップグレードメッセージがマイグレーション中に生成されるかが選択されます。VB Migration Partnerはデフォルトで、課題、警告、TODOメッセージを生成しますが、その全てが変換されたVB.NETアプリケーションに、コメントとして含まれます。ID、重要性(課題、警告、TODO)、タイプ(文法、言語、コード分析、ライブラリ)等の選択によって、メッセージを無効にしたり有効にしたりすることができます。
Disables generation for a specific message. The messageid argument is the hex numeric value of the message:
このプラグマは、特定のメッセージの生成を無効にします。messageidID引数は、16進数のメッセージIDです。
'## Rem disable the message “Controls of type XYZ aren’t supported…” '## DisableMessage 02C8
Disables message generation for a specific language category. The argument can be: Info, ToDo, Warning, Issue, Syntax, Language, CodeAnalysis, Library, All:
このプラグマは、特定の言語カテゴリーのメッセージ生成を無効にします。この引数は、Info、ToDo、Warning、Issue、Syntax、Language、CodoAnalysis、Library、Allのどれかになりえます。
'## Rem disable all messages except issues and warnings '## DisableMessages All '## EnableMessages Issue '## EnableMessages Warning
Enables generation for a specific message. The messageid argument is the hex numeric value of the message:
このプラグマは、特定のメッセージ生成を有効にします。messageid引数は16進数のメッセージIDです。
'## Rem disable all messages except “Controls of type XYZ aren’t supported…” '## DisableMessages All '## EnableMessage 02C8
Enables message generation for a specific language category. The argument can be: Info, ToDo, Warning, Issue, Syntax, Language, CodeAnalysis, Library, All:
このプラグマは、特定の言語カテゴリーについてのメッセージ作成を有効にします。この引数は、Info、ToDo、Warning、Issue、Syntax、Language、CodoAnalysis、Library、Allのどれかになりえます。
'## Rem disable messages except those related to code analysis '## DisableMessages All '## EnableMessages CodeAnalysis
Specifies that a specific symbol should be considered as used even if VB Migration Partner can’t detected any reference to it. It is useful when the member is accessed through late binding or the CallByName method:
このプラグマは、例えVB Migration Partnerが、それについての参照を検出しなくても、特定の記号が使用されたとみなされるよう特定します。これは、メンバが遅延バインディングやCallByNameメソッドによりアクセスされる場合に役立ちます。
'## Rem consider the PrintReport method as referenced '## PrintReport.MarkAsReferenced
Notice that this pragma must have a scope prefix.
このプラグマはスコープを表す接頭辞が必要であることにご注意下さい。
Specifies that all public members of current user control or class should be considered as used even if VB Migration Partner can’t detected any reference to it. It is useful inside ActiveX DLL or EXE projects that aren’t migrated together with their clients:
このプラグマは、例えVB Migration Partnerが、それについての参照を検出しなくても、現在のユーザーコントロールやクラスの全てのパブリックメンバが使用されたとみなされるように指定します。これは顧客が移行しないActiveX DLLプロジェクトやEXEプロジェクトで役立ちます。
'## Rem mark all public members in all public classes as referenced '## project:MarkPublicAsReferenced
Executes an external application or an operating system command before starting the conversion of current project; cmdtext is the name of the external application or O.S. command, including its path if the application can’t be found on system path. If the command is an internal O.S. command (e.g. Copy) or the name of a batch file, the command should be prefixed by cmd /C and be run through the command-line interpreter:
このプラグマは、現行のプロジェクトを変換し始める前に外部のアプリケーションやOSのコマンドを実行します。cmdtextは、外部のアプリケーションやOSコマンドの名前で、アプリケーションがシステムパスにない場合は、そのパスを含みます。コマンドが内部のOSコマンド(例えばCopy)やバッチファイルの名前だった場合は、そのコマンドは、cmdかCを接頭辞として付けなければならず、コマンドラインインタープリタによって作動します。
'## PreCommand notepad.exe c:\docs\instructions.txt '## PreCommand cmd /C copy c:\vbproject\*.* c:\backup
cmdtext can include the following special placeholders (not case sensitive)
cmdtextは、以下の特別なプレースフォルダ(大文字と小文字の区別は無視されます)を含みます。
It is a good idea to enclose these placeholders between double quote, in case the project name or path include spaces. For example, you can use the PreCommand pragma to restore all VB6 files from a backup folder before starting the migration:
プロジェクト名やパスが半角スペースを含む場合、これらのプレースフォルダを二重引用符で囲むことは効果的です。例えば、移行開始前に、全てのVB6ファイルをバッグアップフォルダから復元する為に、PreCommandプラグマを使用できます。
'## PreCommand cmd /c copy "${vb6projectpath}\backup\*.*" "${vb6projectpath}"
The PreCommand pragma can only have an (implicit or explicit) project scope. You can apply the PreCommand pragma only by storing it in a *.pragmas file. We suggest that you use the special file named VBMigrationPartner.pragmas, which you can conveniently share among all the projects of a complex application, and use project placeholders to differentiate between individual projects.
PreCommandプラグマは(明示的または暗黙的な)プロジェクトスコープのみ持つことができます。また、このプラグマは、*.pragmaファイルに格納しないと利用できません。弊社はVB Migration Partner.pragmaという名前の専用ファイルと – このファイルは複雑なアプリケーションを持つ全てのプロジェクト間で共有することができます – 個々のプロジェクトを区別するプロジェクトプレースフォルダを使用することを推奨します。
Executes an external application or an operating system command after saving the migrated .NET version of current project; cmdtext is the name of the external application or O.S. command, including its path if the application can’t be found on system path. If the command is an internal O.S. command (e.g. Copy) or the name of a batch file, the command should be prefixed by cmd /C and be run through the command-line interpreter:
このプラグマは、移行された現行プロジェクトの.NETバージョンを保存した後に、外部のアプリケーションや、OSシステムを実行します。cmdtextは、外部アプリケーションやOSコマンドの名前で、もしアプリケーションがシステムパスで見つけられない場合は、そのパスを含みます。もし、コマンドが、内部OS(例えばCopy)であったり、バッチファイルの名前であったりした場合、そのコマンドは、cmdかCを接頭辞として付けなければならず、コマンドラインインタープリターによって動きます。
'## PostCommand notepad.exe "c:\docs\after migration instructions.txt" '## PostCommand cmd /C copy c:\vbproject\*.* c:\backup\vbproject
cmdtext can include the following special placeholders (not case sensitive)
cmdtextは以下の専用のプレースフォルダ、(大文字と小文字の区別を無視されます)を含みます。
It is a good idea to enclose these placeholders between double quote, in case the project name or path include spaces. For example, you can use the PostCommand pragma to copy all VB.NET source files to a backup folder immediately after saving them
プロジェクト名やパス名に半角スペースが含まれる場合に、これらのプレースフォルダを二重引用符で囲むことはとても効果的です。例えば、PostCommandプラグマで全てのVB.NETのソースファイルをコピーし、保存した直後にバックアップフォルダを作成出来ます。
'## PostCommand cmd /c copy "${projectpath}\*.*" "c:\backup\${vb6projectname}"
The PostCommand pragma can only have an (implicit or explicit) project scope.
PostCommandプラグマは(明示的または暗黙的な)プロジェクトスコープのみ持つことができます。
The PostCommand pragma is very helpful to preserve one or more .NET “definitive” source files that have been accurately edited and refined and that you don’t want to be overwritten in subsequent migrations. VB Migration Partner always deletes all the files in the target .NET directory, therefore you can’t really prevent a file from being overwritten; however, you can store all these “definitive” files in a given folder and use a PostCommand pragma to ensure that these files are copied over the files produced by the migration that has just been completed:
PostCommandプラグマは、正確に修正または改善した、以降の変換では上書きしたくない、1つ以上の「最終的な」.NETソースファイルを保存するのにとても役立ちます。VB Migration Partnerは、常にターゲットの.NETディレクトリの全てのファイルを削除するので、実際にはファイルの上書きを防ぐことはできません。しかし、全ての「最終的な」ファイルを特定のフォルダに保存するために、PostCommandプラグマを使用して変換によって生成されたファイルをこれらのファイルに上書きコピーすることが出来ます。
'## PostCommand cmd /c copy "c:\definitiveprj\${projectname}\*.*" "${projectpath}" /Y
This technique is especially useful to preserve *.designer.vb files containing the code-behind portions of converted .NET forms.
このテクニックは、変換された.NETフォームのコードビハインド部分を含む*designer.vbファイルを保存する時に特に便利です。
Creates a tag with a given name and value. This pragma can be only useful when a VB Migration Partner extender recognizes and uses it. The following example assumes that you have installed an extender that recognizes the pragma tag named “DatabaseName”
このプラグマは、特定の名前と値を持つタグを作ります。このプラグマはVB Migration Partnerのエクステンダーがそれを認識し、使用した時のみ役立ちます。以下のサンプルは、DatabaseNameという名前のプラグマタグを認識するエクステンダーをインストールすることを想定しています。
'## SetTag DatabaseName, “SqlServer”