我打算将大型vb6应用程序升级到.net.该项目使用许多第三方组件,例如VSFlexGrid以及水晶报告.它还使用源代码不可用的旧VB6 dll.我的问题是
我欢迎任何以前做过这件事的人提供任何有用的意见.
我已经使用Artinsoft的VB6到.NET向导将VB6应用程序转换为C#,并且我在以前使用过Err.Number的任何地方都收到了升级警告.
// UPGRADE_WARNING:(2081)Err.Number有一个新的行为.
转换后的代码是指;
Microsoft.VisualBasic.Information.Err().Number
Run Code Online (Sandbox Code Playgroud)
我没有运气,找出差异是什么.有谁知道它可能是什么,或者忽略这个警告是否安全?
UPDATE
对于任何在将来偶然发现这个问题的人 - 一句警告; 在C#.NET应用程序中继续使用Err.Number是不安全的.该属性仍然可用,但是在错误发生后没有按预期填充.如果错误来自COM组件,则唯一可以按预期填充它的情况.
正常错误,例如DB访问,IO操作等不会给Err().Number赋值,因此不幸的是它的使用必须重构.
奇怪的是,在VB .NET中,它仍然按预期工作,因此在决定转换的目标语言时,可能需要记住这一点.
我在我的VB.NET DLL中有一些功能,我可以通过使用以下内容从我的VB6应用程序"隐藏":
<Runtime.InteropServices.ComVisible(False)> _
Run Code Online (Sandbox Code Playgroud)
但有没有办法让COM客户端只能看到一个函数,而不是.NET程序集?
这样我可以在.NET端使用共享方法,避免了实例声明的需要.
我几乎完成了将模块从VB6转换为VB.NET,但是我遇到了以下2个引号的问题,我想知道是否有任何方法可以解决这个问题:
Structure AUDINPUTARRAY
bytes(5000) As Byte
End Structure
Run Code Online (Sandbox Code Playgroud)
我正在尝试将该字节行更改为:Dim bytes(5000)as Byte,但它不允许我在结构中定义大小.
这是第二个:
Private i As Integer, j As Integer, msg As String * 200, hWaveIn As integer
Run Code Online (Sandbox Code Playgroud)
我不知道如何转换:msg As String*200
我试图在C#中调整3D数组的大小.
VB6代码如下:
ReDim Combos(ProductNum, 4, 3)
Run Code Online (Sandbox Code Playgroud)
由于我不能Array.Resize用于3D数组,我还有另一种方法可以在C#中执行此功能吗?
我已经将数组声明为3D数组:
int[ , , ] Combos;
Run Code Online (Sandbox Code Playgroud)
但我无法调整大小.有任何想法吗?
我有一个vb6 COM对象,我正在转换为VB.Net 2012
我的示例代码如下所示:
Dim ObjContext ,objx ,objy As Object
Dim Rs As ADODB.Recordset
Set ObjContext = GetObjectContext
Set objx =ObjContext.CreateInstance("abc.class1")
Set Objy = ObjContext.CreateInstance("abcde.class2")
Set Rs = objx.getvalue(query)
If Rs.EOF And Rs.BOF Then
ObjContext.SetAbort
Set objx = Nothing
Set ObjContext = Nothing
Set Objy = Nothing
End If
Run Code Online (Sandbox Code Playgroud)
VB 2012中GetObjectContext()和createinstance()的等价物是什么?
我怎样才能从.net中删除这个概念?
实际上,每次我使用Early绑定代码来使用ADODB Connection时,但是现在我想使用Late Binding Code。据我看来,代码似乎是完美的,但我却不知道如何得到错误,例如“参数类型错误,超出可接受范围或彼此冲突”。
Sub Test()
Dim cn As Object
Dim rs As Object
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.RecordSet")
cn.Open "Provider=Microsoft.JET.Oledb.4.0;Data Source=Y:\Operational Non Sensitive\Avon UK\UK Voice Productivity\UK AHT Report_.mdb"
rs.Open "Table1", cn, adOpenDynamic, adLockOptimistic
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
End Sub
Run Code Online (Sandbox Code Playgroud) 我正在考虑将一些用 VB6 编写的遗留 COM 代码迁移到 .NET,但这需要生成一个与原始代码相当接近的类型库。
在早期绑定到其他 VB6 组件时,我遇到了传递参数数组的问题。在最初的 VB6 中,签名如下所示:
Public Function ExecSPReturnRS(ByVal strProcAs String, _
ParamArray varParams() As Variant) As Recordset
Run Code Online (Sandbox Code Playgroud)
并生成如下所示的 MIDL:
[id(0x60030009), vararg]
HRESULT ExecSPReturnRS([in] BSTR strProc,
[in, out] SAFEARRAY(VARIANT)* varParams,
[out, retval] _Recordset** );
Run Code Online (Sandbox Code Playgroud)
使用 C#,我无法确定生成相同 MIDL 的正确声明。我要么缺少vararg声明,要么 varParams 参数被声明为而SAFEARRAY(VARIANT)不是SAFEARRAY(VARIANT)*.
因此,如果在 C# 中我声明为:
Recordset ExecSPReturnRS(string storedProc, ref object[] arguments);
Run Code Online (Sandbox Code Playgroud)
...我明白了SAFEARRAY(VARIANT)*,但没有vararg。但是如果我声明为
Recordset ExecSPReturnRS(string storedProc, params object[] arguments);
Run Code Online (Sandbox Code Playgroud)
...然后我得到了vararg但 SAFEARRAY 未声明为引用。
我希望这MarshalAsAttribute可能是可行的方法,但到目前为止我能想到的最好方法是:
Recordset …Run Code Online (Sandbox Code Playgroud) 我必须使用旧的 VS2008 转换工具将一些 VB6 代码转换为 VB.net。当不确定原始代码和转换后的代码是否等效时,该工具可以帮助插入警告注释。其中一个例子是:
UPGRADE_WARNING:Mod 有新行为
单击了解更多信息:'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="9B7D5ADD-D8FE-4819-A36C-6DEDAF088CC7"'
ms-help://...据我所知,这个“链接”不再起作用。我也无法在网络上找到任何引用该链接的内容。
这个警告实际上指的是什么?功能上有什么区别mod?
vb6-migration ×10
vb6 ×8
vb.net ×4
.net ×3
c# ×3
com-interop ×2
com ×1
excel ×1
excel-vba ×1
vba ×1