在 ActiveX dll 项目中创建列表(对象),在 Visual Basic 6.0 中用于 c# 项目

Posted

技术标签:

【中文标题】在 ActiveX dll 项目中创建列表(对象),在 Visual Basic 6.0 中用于 c# 项目【英文标题】:Creating a List(object) in an ActiveX dll project, in Visual Basic 6.0 to use in c# project 【发布时间】:2012-03-10 05:21:30 【问题描述】:

我想在 Visual Basic 6.0 的 ActiveX 组件项目中创建一个列表。然后我会得到

来自 c# 项目的列表。

谢谢

【问题讨论】:

好的。什么问题? 【参考方案1】:

使用 c#,您可以创建自己的控件。你有不同的可能性来做到这一点。

    System.Windows.Forms.Control 派生为类并添加您的功能。这是最灵活但也最复杂的方法。 从现有控件中派生为类,该控件接近您想要执行的操作并对其进行调整(例如,通过覆盖 OnPaint)。 将UserControl 添加到您的项目中。您可以在 UserControl 上放置其他控件,就像在表单上放置控件一样。

您可以在主程序集 (.exe) 中执行此操作;但是,如果您在类库 (.dll) 中执行此操作,则可以像使用 ActiveX 控件一样使用它。在 .NET 中,您不需要 ActiveX 控件的“魔力”。控件只是派生自Control 的类。


我经常从ListBox 派生我自己的控件并覆盖OnPaint,以便通过添加图标、使用不同颜色或在多行上显示文本以不同的方式显示项目。

这是我以这种方式自定义的ListBox 示例


编辑

您是否正在寻找 VB6 的 Collection 类型的替代品?在 C# 或 VB.NET 中,您使用 System.Collections.Generic 命名空间的集合。 List<T> 用于列表,Dictionary<TKey,TValue> 用于存储键/值对。

列表示例:

var list = new List<string>();
list.Add("Hello");
list.Add("World");

Console.WriteLine(list[0]); // ==> "Hello"
Console.WriteLine(list[1]); // ==> "World"

foreach (string s in list) 
    Console.WriteLine(s);

// Output:  Hello
//          World

键值对示例:

var dict = new Dictionary<string,int>();
dict.Add("Sunday", 1);
dict.Add("Monday", 2);
dict.Add("Tuesday", 3);
dict.Add("Wednesday", 4);
dict.Add("Thursday", 5);
dict.Add("Friday", 6);
dict.Add("Saturday", 7);

Console.WriteLine(dict["Wednesday"]); // ==> 4

int daynum;
if (dict.TryGetValue("Christmas", out daynum)) 
    Console.WriteLine("Christmas has the day number 0.", daynum);
 else 
    Console.WriteLine("Christmas is not a weekday.");


编辑

要在 .NET 中使用通过 VB6 创建的 ActiveX,您需要 .NET SDK 中提供的命令行实用程序 TlbImp。像这样称呼它

tlbimp MyActiveX.dll /out:MyCsharp.dll

然后您可以像使用任何其他 .NET dll 一样使用MyCsharp.dll。见C# and ActiveX DLLs by Anand Narayanaswamy。

【讨论】:

嗨 Olivier,List 的意思就像 Visual Basic 6 中的对象列表。我在 Visual Basic 6 中创建了 ActiveX dll 项目。我在 do 循环中有记录。我会将这些记录添加到一个列表中,然后当我在 c# 项目中引用这个 dll(在 VB6 中创建)时,我将使用记录列表。 Bertan,你应该更加努力地问这个问题。你想达到什么目的?您能否提供一个您迄今为止在 VB6 中编写的代码示例?有人对您的问题投了反对票,因为它难以理解。不过,我更新了我的答案。与 VB6 相比,你可以用 c# 做更多的事情。尝试使用 VB6 解决 c# 问题对我来说似乎很奇怪。 嗨,奥利维尔。我使用 VB6,因为我有一个软件开发工具包,用于指纹设备,用 VB6 编写。该 Sdk 在 C# 中无法直接正常工作。所以我尝试用VB6将该sdk包装到一个ActiveX dll项目中。然后我将在我的 C# 项目中使用该 dll。 我添加了关于如何在 c# 中使用 ActiveX 的说明。您的问题可能应该是“如何在 .NET 中使用用 VB6 创建的 ActiveX?”并且与列表无关。 那个标题不是我想要的,我仍然想将指纹设备记录列表从 VB6(ActiveX Project) 端传递到 C# 端,但这对我来说也是一个问题。我使用 TlbImp 将我的非托管代码转换为托管 .net 代码,它是成功的,但是在 c# 端,当我将我的 dll 导入 c# 项目并尝试使用我的方法时,它会抛出一个 InvalidCastException ->

以上是关于在 ActiveX dll 项目中创建列表(对象),在 Visual Basic 6.0 中用于 c# 项目的主要内容,如果未能解决你的问题,请参考以下文章

删除在 DLL 中创建的对象

如何在 C# 中创建 COM 可见类?

使用 CreateObject ActiveX 组件无法创建带有注册类库的对象

关于在 QT 中创建项目

如何在 JavaScript 中创建唯一项目列表? [复制]

ActiveX - 控件的大小调整问题,在 .NET 中创建