如何将对象集合从 VB6 传递到 .NET?

问题描述 投票:0回答:4

我需要将一组键/值对字符串从 VB6 传递到 .NET。在 VB6 代码中,它们存在于本机集合中。但是我不确定我可以在我的 .NET 项目中引用什么,以便能够在我的一种方法中接受 Collection 类型的参数。

我尝试添加对 Visual Basic for Applications 的引用,但返回“无法添加对‘Visual Basic For Applications’的引用。”

我做错了吗?

c# .net vb6 interop com-interop
4个回答
3
投票

你可以在 c# 中使用这样的东西:

[Guid("fb5e929a-2f8b-481e-9516-97edf5099df4")]
[ComVisible(true)]
public interface myInterface{
public void addObject(string key, string value);
}

在你的课堂上,你可以有这个:

private collection
public addObject(string key, string value)
{
collection.Add(key, value);
}

这应该允许您在 vb6 中调用 addObject 并传递您的数据。然后 .net 会将它添加到一个集合中,所以不是将整个集合从 vb6 传递到 .net,而是一个一个地传递它们。

您可以在此处阅读有关 GUID 的更多信息。

有关 COM 的更多信息,这里有一个 vb6 和 c# 之间的代码示例。


2
投票

与使用 COM 相比,我发现将数据序列化为 JSON 并将其作为纯文本通过 Interop 鸿沟发送要简单得多。一开始我很抗拒,但现在它是我的首选解决方案。如果“适当”的解决方案令人沮丧,请尝试一下。


1
投票

尝试通过在 Visual Basic 6.0 中创建 HashTable 将其传递给

.NET

Set dictionary = Server.CreateObject("System.Collections.HashTable")
With dictionary
    For i = 1 To 100
        .Add Chr(i), "some text value"
    Next
End With

然后在 C# 或 VB.NET COM 公开类

public string LoadHashTable(Object tDict)
{
   return String.Format("Type : \"{0}\", Count : {1}", ((Hashtable)tDict).GetType().ToString(), ((Hashtable)tDict).Count);
}

COM 公开类的示例在 Stack Overflow 问题中使用 4.0 框架和 Visual Studio 2010 为 ASP Classic 构建 COM 互操作库

记得在 x86 和 x64 中注册它:

%windir%\Microsoft.NET\Framework\v4.0.30319\regasm MyThing.dll /tlb:MyThing.tlb /codebase MyThing

%windir%\Microsoft.NET\Framework64\v4.0.30319\regasm MyThing.dll /tlb:MyThing.tlb /codebase MyThing

0
投票

您的 VB6 函数可以从 Microsoft Scripting Runtime 库返回字典。在 .NET 中,您可以向它添加 COM 引用。我发现将其转换为 System.Collections.Generic.Dictionary 很有用。为此,我创建了一个通用扩展,允许我指定键和值的类型。

        public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this Scripting.Dictionary p_ScriptingDictionary)
    {
        string codeName = m_ModuleName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "()";

        try
        {
            var dic = p_ScriptingDictionary.Cast<object>().ToDictionary(
                keySelector: elm => (TKey)elm,
                elementSelector: elm => (TValue)p_ScriptingDictionary.get_Item(ref elm));
            return dic;
        }
        catch (Exception ex)
        {
            throw new ApplicationException("Error converting Scripting.Dictionary to Systems.Collections.Generic.Dictionary.", ex);
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.