尝试使用 COM-interop 从 C# 库中附加 vb6 中的对象时,获取“无法将 'Field' 转换为 'Field' 类型(同一类)”

Posted

技术标签:

【中文标题】尝试使用 COM-interop 从 C# 库中附加 vb6 中的对象时,获取“无法将 \'Field\' 转换为 \'Field\' 类型(同一类)”【英文标题】:Get, "cannot cast 'Field' to 'Field' type (same class)" when trying to Append an object in vb6 from C# library using COM-interop尝试使用 COM-interop 从 C# 库中附加 vb6 中的对象时,获取“无法将 'Field' 转换为 'Field' 类型(同一类)” 【发布时间】:2021-06-08 21:33:23 【问题描述】:

我有一个旧版 vb6 代码使用的 C# 库。这对大多数事情都非常有效,除了我遇到了附加对象的问题。

在某种程度上,我正在尝试模拟一些访问数据库函数调用并将它们重定向到不同的数据库解决方案。但这与我遇到的问题无关,只是一些背景知识。

我有另一个与这个非常相似的对象和类; Append 也做同样的事情。代码的不同之处仅在于它不是使用的“对象”而是固定类型。我尝试这样做是因为 COM 标准不支持泛型。

任何想法或帮助都会非常有帮助。

在 vb6 中

Dim fld As Field
Set fld = new Field
NewTd.Fields.Append fld     'gives an error that Field can't be cast to type Field. 

C#

字段:

 [Guid("2515418d-04af-484e-bb3b-fe53a6121f73")]
 [ClassInterface(ClassInterfaceType.None)]
 public class Field : IField
 
     public string Name  get; set; 
     public string Value  get; set; 

     public int Type  get; set;  //private int TypePV;
     // 3 more public ints.


     enum FieldType
     
         // different field types.
     

---

 [Guid("fd362bff-da4e-4419-a379-1ed84ff74f1b")]
 public interface IField
 
        string Name  get; set; 
        string Value  get; set; 
        int Type  get; set; 
        // three more ints.

 

Append 的定义位置。

[Guid("0cf3c33f-8ca8-4a5b-8382-d1612558fcad")]
[ClassInterface(ClassInterfaceType.None)]
public class FieldsO : IFieldsO

    public object obj;
    public FieldsO(object cobj)
    
        obj = cobj;
    

    public object this[string param]
    
        get 
        
            if (obj.GetType() == typeof(Recordset))
                return ((Recordset)obj)[param];
            if (obj.GetType() == typeof(TableDef))
                return ((TableDef)obj)[param];
            return null;
        
        set 
         
            if (obj.GetType() == typeof(Recordset))
                ((Recordset)obj)[param] = value; 
            if (obj.GetType() == typeof(TableDef))
                ((TableDef)obj)[param] = (IField)value; 
        
    

    public void Append(Field io) 
        if (obj.GetType() == typeof(TableDef)) 
            if (!((TableDef)obj)._Fields.ContainsKey(io.Name))
                ((TableDef)obj)._Fields.Add(io.Name, io);
        
    

    public int Count() 
        if (obj.GetType() == typeof(Recordset))
            return ((Recordset)obj).dt.Columns.Count;
        if (obj.GetType() == typeof(TableDef))
            return ((TableDef)obj)._Fields.Count;
        return -1;
    


---

 [Guid("fe528160-1505-448e-bb9c-8ccfd9e3643d")]
 public interface IFieldsO
    
       object this[string param]  get; set; 
       int Count();
       void Append(Field io);
    

【问题讨论】:

尝试将Append(Field io) 定义为Append(IField io) 您确定您的 VB 类型 Field 与您在类型库中导出的类型相同。也许还有另一个 Field 类型污染了你的命名空间 请发布一个最小的、可重复的示例***.com/help/minimal-reproducible-example 我建议重命名任何与 ADO 共享名称的类,至少作为诊断。如果重命名后错误仍然存​​在,那么这不是问题。 无需删除 ADO 或重命名任何内容。在 VB 中声明变量时只需使用完全限定的对象名称,例如Dim fld As MyInterface.Field。有很多 COM 对象同时使用,其中属性/方法共享相同的名称。如果您不确定正确的 VB 名称是什么,请按 F2(对象资源管理器)并查看 VB 如何引用它。 【参考方案1】:

答案很简单。 我将代码更改为期待 Append 上的“对象”,并发现 vb6 错误代码更具体。它在代码的来源方面存在问题。从那里我所做的就是制作项目(将其编译为可执行文件),一切都按预期工作,没有例外,没有。

解决方案,正如它通常看起来的那样,是在处理奇怪的错误时不依赖 vb6 IDE。

【讨论】:

以上是关于尝试使用 COM-interop 从 C# 库中附加 vb6 中的对象时,获取“无法将 'Field' 转换为 'Field' 类型(同一类)”的主要内容,如果未能解决你的问题,请参考以下文章

效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中附源代码下载) 转

在 C# 类库中使用 IConfiguration

C#中出现的错误

如何使用Python在现有XML中附加一堆标签

C#如何从Tao库中获取OpenGL中生成的对象的大小

如何从 C# 代码的库中调用 C 方法?