gpt4 book ai didi

c# - 在 C# 中编写 COM 对象并在 C# 中使用它

转载 作者:行者123 更新时间:2023-11-30 13:04:22 28 4
gpt4 key购买 nike

我想在 C# 中实现一个 COM 对象,并在 C# 中使用它(除了 C++ 和其他语言)。

这是实现 COM 对象的 DLL 代码:

namespace TestComServer {
[ComVisible(true),
Guid("565D8202-6C0F-4AAB-B0F6-49719CD13045"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
]
public interface ITestObject {
void DoSomething();
}

[
ComVisible(true),
GuidAttribute("21293767-A713-49E2-968E-7DDE0B0DAB94"),
ClassInterface(ClassInterfaceType.None)
]
public class TestObject : ITestObject {
public TestObject() {
}

public void DoSomething() {
}
}
}

我使用 gacutil 将 DLL 添加到全局程序集缓存。

EXE 通过以下方式使用 COM 对象(就像我成功地使用了一些用 C++ 实现的 COM 对象):

[
ComImport(),
Guid("565D8202-6C0F-4AAB-B0F6-49719CD13045"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
]
public interface ITestObject {
[PreserveSig ]
void DoSomething();
}

[ComImport, Guid("21293767-A713-49E2-968E-7DDE0B0DAB94")]
public class TestObject {
}

private void button1_Click(object sender, EventArgs e) {
object o = new TestObject();
ITestObject t = (ITestObject)o;
t.DoSomething();
}

当执行 object o = new TestObject(); 行时,我得到一个 InvalidCastException。这段代码有什么问题?

An unhandled exception of type 'System.InvalidCastException' occurred in Test.exe Additional information: Das Objekt des Typs "TestComServer.TestObject" kann nicht in Typ "TestObject" umgewandelt werden.

最佳答案

如果您更改 EXE 使其仅导入接口(interface),则使用 Type.GetTypeFromCLSID 和 Activator.CreateInstance 实例化对象:

[
ComImport(),
Guid("565D8202-6C0F-4AAB-B0F6-49719CD13045"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
]
public interface ITestObject {
[PreserveSig ]
void DoSomething();
}

private void button1_Click(object sender, EventArgs e) {
Type type = Type.GetTypeFromCLSID(new Guid("21293767-A713-49E2-968E-7DDE0B0DAB94"));
object o = Activator.CreateInstance(type);
ITestObject t = (ITestObject)o;
t.DoSomething();
}

我以前没有使用过导入 COM 对象的方法,所以这可能行不通。通常我在一个单独的程序集中定义我的接口(interface),该程序集也暴露给 COM,然后由 DLL 和 EXE 引用。 EXE 使用上述方法实例化 DLL,并将其转换为它引用的 .NET 接口(interface)。

关于c# - 在 C# 中编写 COM 对象并在 C# 中使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9575358/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com