C# 无法查看或使用 COM 对象的方法
C# unable to see or use a COM object's methods
在阅读了无数有关从 C# 访问 COM 对象的问题后,似乎没有任何问题可以解决我的问题。我在 C++ 中创建了一个 COM 对象并成功注册了它。 OLEView 可以查看并创建我的对象的实例。我还能够创建它的实例并使用简单的单独 C++ 应用程序调用它的方法。
在 C# 中,我在引用管理器 -> COM -> 类型库中添加了 DLL,似乎能够创建对象的实例(名为 Coffee):
System.Guid g = new System.Guid("D857715A-BEB9-4436-BBB7-1143F651196C");
Type myType = Type.GetTypeFromCLSID(g);
dynamic obj = Activator.CreateInstance(myType);
Coffee xx = (Coffee)obj;
GUID 表示 COM 对象在我的 .idl 中的组件类:
...
[
uuid(D857715A-BEB9-4436-BBB7-1143F651196C)
]
coclass Coffee
{
[default] interface ICoffee;
[default, source] dispinterface _ICoffeeEvents;
};
此对象包含一个成员变量'ounces'、一个get_ 和put_,以及一个名为TestMethod 的方法,该方法除了return S_OK 外什么都不做。所有这些都可以从 C++ 中调用。在 C# 中,智能感知除了对象的 'int ICoffee.Ounces' 之外什么也看不到。 get_ 和 put_ 没有出现,TestMethod 也没有出现。
我也试过 Type.GetMethod("TestMethod") 并调用它,但 MethidInfo 最终为空:
MethodInfo testMethod = myType.GetMethod("TestMethod");
object value = testMethod.Invoke(obj, new object[] { });
还尝试在动态对象上调用它:
obj.TestMethod();
Additional information: 'System.__ComObject' does not contain a definition for 'TestMethod'
没有让 C# 完全使用该对象,我到底错过了什么?
编辑:
.idl 中的 ICoffee:
[
object,
uuid(35B4618D-733B-453D-9714-FFCB35740FB2),
dual,
nonextensible,
pointer_default(unique)
]
interface ICoffee : IDispatch{
[propget, id(1)] HRESULT Ounces([out, retval] LONG* pVal);
[propput, id(1)] HRESULT Ounces([in] LONG newVal);
[id(2)] HRESULT GetOunces([in] LONG* nOunces);
[id(3), helpstring("This is a test method")] HRESULT TestMethod();
};
嗯,我从头开始我的两个测试项目,这次(使用早期绑定访问)我能够访问我的方法。不确定哪里出了问题.. 但已解决。
在阅读了无数有关从 C# 访问 COM 对象的问题后,似乎没有任何问题可以解决我的问题。我在 C++ 中创建了一个 COM 对象并成功注册了它。 OLEView 可以查看并创建我的对象的实例。我还能够创建它的实例并使用简单的单独 C++ 应用程序调用它的方法。
在 C# 中,我在引用管理器 -> COM -> 类型库中添加了 DLL,似乎能够创建对象的实例(名为 Coffee):
System.Guid g = new System.Guid("D857715A-BEB9-4436-BBB7-1143F651196C");
Type myType = Type.GetTypeFromCLSID(g);
dynamic obj = Activator.CreateInstance(myType);
Coffee xx = (Coffee)obj;
GUID 表示 COM 对象在我的 .idl 中的组件类:
...
[
uuid(D857715A-BEB9-4436-BBB7-1143F651196C)
]
coclass Coffee
{
[default] interface ICoffee;
[default, source] dispinterface _ICoffeeEvents;
};
此对象包含一个成员变量'ounces'、一个get_ 和put_,以及一个名为TestMethod 的方法,该方法除了return S_OK 外什么都不做。所有这些都可以从 C++ 中调用。在 C# 中,智能感知除了对象的 'int ICoffee.Ounces' 之外什么也看不到。 get_ 和 put_ 没有出现,TestMethod 也没有出现。
我也试过 Type.GetMethod("TestMethod") 并调用它,但 MethidInfo 最终为空:
MethodInfo testMethod = myType.GetMethod("TestMethod");
object value = testMethod.Invoke(obj, new object[] { });
还尝试在动态对象上调用它:
obj.TestMethod();
Additional information: 'System.__ComObject' does not contain a definition for 'TestMethod'
没有让 C# 完全使用该对象,我到底错过了什么?
编辑: .idl 中的 ICoffee:
[
object,
uuid(35B4618D-733B-453D-9714-FFCB35740FB2),
dual,
nonextensible,
pointer_default(unique)
]
interface ICoffee : IDispatch{
[propget, id(1)] HRESULT Ounces([out, retval] LONG* pVal);
[propput, id(1)] HRESULT Ounces([in] LONG newVal);
[id(2)] HRESULT GetOunces([in] LONG* nOunces);
[id(3), helpstring("This is a test method")] HRESULT TestMethod();
};
嗯,我从头开始我的两个测试项目,这次(使用早期绑定访问)我能够访问我的方法。不确定哪里出了问题.. 但已解决。