gpt4 book ai didi

c# - 如何从 C# 调用 COM 对象

转载 作者:行者123 更新时间:2023-12-04 12:05:57 25 4
gpt4 key购买 nike

首先,我意识到这里有很多帖子讨论了这个话题。我一定很容易地阅读了其中的 20 多篇。但他们都没有给出我寻求的答案。

我编写了一个很小的 ​​C# 测试 COM DLL,其中有一个打印“我还活着!”的方法。在一个消息框中。以管理员身份使用 VStudio,我可以构建和注册 COM 对象。我已经成功地从 VBA 调用了该对象并运行了该方法。我可以在 VStudio 添加引用/COM 对话框中看到 COM 接口(interface)的名称。这一切都让我觉得这个对象是正确构造、注册和可用的。

现在我试图从控制台 C# 应用程序调用它。像许多其他人一样,我试图找出等效于 VBA“CreateObject("DLLName.ClassName")”的代码来获取 C# 中的对象。

一种方法是将 DLL 的引用添加到我的控制台应用程序项目中。我通过“添加引用”对话框的“项目”部分而不是通过对话框的 COM 部分指向程序集。那么我可以简单地说var o = new MyComImplementationClass();并像对待任何其他类(class)一样对待它。这有效,但这意味着我的控制台应用程序在作弊并且没有通过通常的 COM GAC 接口(interface)使用 COM 对象。

另一种方法(这不起作用,但我希望它起作用)是通过“添加引用”对话框上的“COM”选项卡添加引用。我可以看到它,但 VS 抗议“XXX.tlb 文件是从 .NET 程序集导出的。改为添加对程序集的引用。”这让我回到上面的解决方案,我认为这意味着我的应用程序在作弊。 (例如,我不必添加对 VBA 测试应用程序的引用。)

另一种方法是使用 Type.GetTypeFromProgId如下面的代码片段所示。但我也不能让它工作。我必须传入不正确的 ProgID 字符串 - 我感觉它与注册表信息有关,并且与我在 VBA 中提供 CreateObject() 的“DLLName.ClassName”字符串不同。

  public static dynamic ComObjectGet () {
const string progID = "ComExampleDLLName.ComImplementationClassName";
Type foo = Type.GetTypeFromProgID (progID);
dynamic COMobject = Activator.CreateInstance (foo);
return COMobject;
}

更糟糕的是, on this MSDN example page它说“此方法是为 COM 支持提供的。Microsoft .NET Framework 中不使用程序 ID,因为它们已被命名空间的概念取代。”所以我可能不应该使用 GetTypeFromProgID根本。

如果有帮助,我可以在 C# 中使用 VSTO 来调用 MSOffice 主互操作程序集。但是它们是从添加引用对话框的 COM 选项卡加载的(我希望从这里加载 COM 库)。

为清楚起见,我的 COM DLL 名称是 ComExampleLibrary.dll。默认命名空间是 ComExampleNamespace。接口(interface)名称为 IComInterface,实现类名称为 ComImplementation。内部方法名称是 Run。

有人可以给我说明或代码片段来执行“正确的、批准的”从 C# 调用 COM 对象(不仅仅是我编写的对象)的事情吗?谢谢你。

最佳答案

感谢帮助我的人,这里是答案。两者 GetTypeFromProgIDGetTypeFromCLSID如下图所示工作。我的问题是我在调用 GetTypeFromProgID 时使用了“AssemblyName.ClassName”而不是“Namespace.ClassName”。

 public static dynamic ComObjectGet () {
const string progID = "ComExampleNamespace.ComImplementation";
Type foo = Type.GetTypeFromProgID (progID);

//var bar = Guid.Parse ("99929AA7-0334-4B2D-AC74-5E282A12D06C");
//Type foo = Type.GetTypeFromCLSID (bar);

dynamic COMobject = Activator.CreateInstance (foo);
return COMobject;
}

所以我的原始代码是正确的,但我传入了错误的参数。此代码段等效于 VBA CreateObject("Namespace.ClassName")称呼。

我仍然不知道为什么我不能像添加任何其他 COM 对象那样在“添加引用”对话框的“COM”选项卡中添加对 COM 项的引用。我想这是一个不同的问题。

关于c# - 如何从 C# 调用 COM 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59434328/

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