我有一个引用VB6 DLL的C#应用程序.当我将C#中的null传递给VB6 dll函数时,null在VB6中被转换为值Empty(value),而不是Nothing(object).例如:
// function in vb6 dll that referenced by c# app
Public Sub TestFunc(ByVal oValue As Variant)
{
...
if oValue is Nothing then
set oValue = someObject
end if
...
}
// main c# code
private void Form1_Load(object sender, EventArgs e)
{
object testObject = new object();
testObject = null;
TestFunc(testObject);
}
Run Code Online (Sandbox Code Playgroud)
当我传递一个对象(非null)时,它将作为对象传递给VB6.但是当null传递给vb6时,它变为值类型为Empty,而不是对象类型Nothing.谁知道为什么?无论如何,当从c#app传递时,我可以强制null为VB6中的Nothing吗?
非常感谢.
VB6有一个DoEvents()方法,您调用该方法将控制权返回给操作系统并模拟该单线程环境中的多线程行为.
VB 6 DoEvents()的.NET框架是什么?
我们是一名ISV,拥有开发和分发用VB6编写的桌面应用程序的经验.我们现在正在开发包含VBA代码的Excel电子表格工具.这些将免费下载给包括当地政府组织在内的各种用户.
我们以前很少在我们自己的组织之外分发电子表格.我们应该遵循哪些最佳做法,是否存在我们应该注意的陷阱?
我知道以下内容.
我需要将一个通用的VBA表单控件对象转换为一个ComboBox对象,以便我可以向它添加项目.通用对象不允许我将项目插入现有列表
Dim ctlCurrent As MSForms.Control
For Each ctlCurrent In frmItemInput.Controls
If TypeName(ctlCurrent) = "ComboBox" Then
Dim lbCurrentComboBox As MSForms.ComboBox
lbCurrentComboBox = ctlCurrent 'This is where the error occurs, when I try to convert one into another
' Adiciona os itens necessários
lbCurrentComboBox.AddItem ("R")
lbCurrentComboBox.AddItem ("D")
End If
Next ctlCurrent
Run Code Online (Sandbox Code Playgroud)
我的问题是:我的表单中有大量的ComboBox,我需要为它们添加相同的选项.所以我想这样做.
2002年,我为客户做了一个非常大的VB6应用程序.它使用了很多UserControls和第三方菜单控件(用于在菜单名称旁边放置图标).它具有动态"可拆分"面板,具有多状态复选框的TreeView等.非常丰富的UI.我在这个项目上的总时间大约是500个小时,客户慷慨地让我分享了整整一个月.(是的,就是那种工作.)但他们非常高兴,他们按时付账,没有任何争议.
因此,在与他们多年没有接触之后,他们突然打电话,想知道我是否可以为他们更新应用程序.Net.我最初的反应就是拒绝,因为我不使用VB.Net.在阅读了大量有关移植等困难的帖子后,我更倾向于拒绝,可以这么说.
不过,在我告诉他们之前,我并不感兴趣大致量化其所需的努力.我很乐意听到任何做过这种事情并且感觉自己有多少工作的人.是吗:
如果您确实已经完成了这种端口,请回复.答案不一定非常准确,因为我真的只是试图将其解决.我的感觉是,努力将至少与原始的努力一样多,如果不是更多的话.但我可能是错的.谢谢你的帮助.
也许我还不太熟悉.NET,但我还没有看到一种令人满意的方式在.NET中轻松实现这个简单的VB6代码(假设这个代码在一个带有N CommandButtons的表单Command1()和N中数组Text1()中的TextBoxes:
Private Sub Command1_Click(Index As Integer)
Text1(Index).Text = Timer
End Sub
Run Code Online (Sandbox Code Playgroud)
我知道它不是非常有用的代码,但它证明了控制数组在VB6中的易用性.C#或VB.NET中最简单的等价物是什么?
我有一个数组,String我必须将其转换为ArrayList.是否有可能在VB.Net中做到这一点?
我公司有大量用VB6编写的遗留应用程序.
我们处于从将VB6应用程序迁移到.NET(特别是3.5)的过渡期.
将VB6转换为.NET的最佳策略是什么?
注意:以下更新应转至"项目管理",与主要问题无关.
[更新]:感谢您的反馈到目前为止,
还有更多问题需要弹出
- 你如何指定开发人员开发新的应用程序?
- 是否应该有一个特殊的一次性升级部门,将遗留应用程序转换为新的应用程序?或者每个开发人员都应参与转换过程吗?
- 只有高级开发人员参与转换吗?初级开发者?还是混合?
看起来,我越想到这个问题,就会出现更多问题.
GetObject上的VB6 帮助说"你不能使用GetObject来获取对用Visual Basic创建的类的引用"(最后一句话!).我的VB6 GUI将对象公开为ActiveX exe,供其他组件操作.我希望其他组件连接到已经运行的GUI,而不是启动exe的新实例.我发现使用GetObject确实有效,如果你使用这个语法:
Set myobj = GetObject("", "ProjectName.ClassName")
Run Code Online (Sandbox Code Playgroud)
它让我担心,帮助说这不应该工作,虽然我做了很多测试,到目前为止没有发现任何问题.任何COM专家谁能告诉我是否会遇到问题?无论如何我会使用CreateObject吗?
ActiveX exe设置是:只有一个线程的线程池.该课程具有MultiUse实例化.这些设置可能足以阻止CreateObject启动exe的新实例.那是对的吗?
如果我有纬度/经度点,我想知道它是否适用于特定坐标系,我该怎么办?
举个例子.假设我在瑞士电网(CH 1903,EPSG 21781)工作并在英国伦敦有一个代表点,我想知道这一点在瑞士网格坐标系中是否有效.
通常情况下,转换会起作用,但它可能远远超出瑞士网格区域的范围,因为它不是真正有效的.
对此的上下文是用户将纬度经度中的点导入到在投影坐标系中起作用的应用程序,并且当它们导入的点落在投影坐标系界限之外时,他们希望被警告.
但据我所知,投影坐标系没有任何界限.