QQuestion: How can I remove an application function and replace calls to it with something different?
A: You can also try this:
In the <compile>Answer:
First of all, an option that should be considered is to keep your original calls as is, but to fine tune the implementation to use .NET by hand. Then, use a Author/Replace or related command to to swap in in your fine-tuned code.
However, if you really want to change the calls, You may add some refactoring commands to your translation script. In the <
compile> section of the script, do a
remove/remove-stubout with a
migPattern. This will rework the calls. Then, after the <analyse> <
analyse> section, use
refactor/remove-delete to remove the original.
Something like this.
Example1: Here is an example you can try using our ScanTool sample:
<Compile Project="%SrcPath%"> <refactor> <remove identifier="ScanToolLib.readNode" migStatus="stubout" migPattern="%1d.ReadXMLNode(%2d))" /> </refactor> </Compile> <Analyse /> ... <refactor> <remove identifier="ScanToolLib.readNode" migStatus="delete" /> </refactor> ... <Author>
Since the methods to be refactored were are in a module, it will not be in an IDF (unless you move the module using the SharedFile command) , so these rules will be needed for each VBP that uses the module – unless you moved the module to an IDF using the
SharedFile command.Another option that is has some appeal is to keep your original application interface calls as is, but fine tune the implementation to use .NET by hand. Then, use author/replacefile to drop in your fine-tuned file. It really depends on what you were doing … and if you want to preserve the interface or not.
Example 2: I have a Declare in a SharedFile, that I want to migrate to a Framework call:
Vb6 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) ... Sleep 500 We want no declaration and calls like this: ... System.Threading.Thread.Sleep(500);
To make things more interesting this Declare was in a module that was shared throughout the system; the declaration is being moved into a host project using the Shared
<Compile Condition="%SrcName%=='AppCommon'"> <Refactor> <Migrate id="GlobalDeclarations.Sleep" nPram="2" migName="System.Threading.Thread.Sleep" migStatus="external" /> </Refactor> </Compile> Changes the calls in AppCommon as expected
The Migrate command also adds a migName to the FromCode IDF generated for the translation:
FromCode\AppCommon.dll.xml <method id="Sleep" migName="System.Threading.Thread.Sleep" type="Void"> <argument id="dwMilliseconds" type="Integer" status="ByVal"/> </method> The migName attribute alters calls made to the method the codes that reference AppCommon.DLL.
Note that in this case, a "migrated" declaration is authored in the generated DLL code; it must be removed with an Author\Fix.
<Author Condition="%SrcName%=='AppCommon'"> <Fix host="%SrcName%" name="PostEdit"> <Replace name="Remove GlobalDeclaration.Sleep"> <OldBlock><![CDATA[ [DllImport("kernel32")] public static extern void System.Threading.Thread.Sleep(int dwMilliseconds); ]]></OldBlock> </Replace> </Fix> </Author>
Note: The XML above uses the Condition attribute of the ScriptRules feature.