尝试使用 COM-interop 从 C# 库中追加 vb6 中的对象时获取 "cannot cast 'Field' to 'Field' type (same class)"
Get, "cannot cast 'Field' to 'Field' type (same class)" when trying to Append an object in vb6 from C# library using COM-interop
我有一个旧版 vb6 代码使用的 C# 库。这对大多数事情都非常有效,除了我 运行 遇到附加对象的问题。
在某种程度上,我试图模拟一些访问数据库函数调用并将它们重定向到不同的数据库解决方案。但这与我 运行 关注的问题不是很相关,只是一些背景知识。
我有另一个对象 class 与这个非常相似;使用 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 上有一个“对象”,并发现 vb6 错误代码更具体。代码的来源存在问题。从那里我所做的就是制作项目(将其编译成可执行文件)并且一切正常,没有例外,没有。
在处理奇数错误时,解决方案通常似乎是不依赖于 vb6 IDE。
我有一个旧版 vb6 代码使用的 C# 库。这对大多数事情都非常有效,除了我 运行 遇到附加对象的问题。
在某种程度上,我试图模拟一些访问数据库函数调用并将它们重定向到不同的数据库解决方案。但这与我 运行 关注的问题不是很相关,只是一些背景知识。
我有另一个对象 class 与这个非常相似;使用 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 上有一个“对象”,并发现 vb6 错误代码更具体。代码的来源存在问题。从那里我所做的就是制作项目(将其编译成可执行文件)并且一切正常,没有例外,没有。
在处理奇数错误时,解决方案通常似乎是不依赖于 vb6 IDE。