无法从 64 位 C# 应用程序调用 C# 32 位 Com

Trouble calling C# 32 bit Com from 64 bit C# application

首先,我知道有几篇关于做我想做的事情的文章。这没什么特别的。但是我在这里和其他地方阅读了大量文章并阅读了多个示例,但我似乎得到了相互矛盾的信息以及非常平庸的成功。我希望熟悉 COM 的人耐心等待并帮助那些第一次接触 COM 的人。

我会根据我的研究解释我认为需要做什么,并请知识渊博的人指出我做错了什么,并帮助我填补知识空白。我的应用程序使用第三方 32 位 DLL 和 64 位 DLL。有一堆 64 位的,只有一个 32 位的。这就是我使用 64 位应用程序的原因。如果有人关心的话,那就是 Minolta kmsecs200.dll。该网站明确表示他们没有 64 位版本。

第一步是创建 32 位 COM 包装器。此时,我的示例代码没有包装任何东西。它只有一个简单的功能。以下是我创建 DLL 所采取的步骤:

创建新的 C#、windows、class 库 (.Net Framework)、.NET Framework 4

将项目命名为“SimpleCom”,将class和CS文件重命名为“JustOne”

在项目属性中: 在“应用程序”选项卡上:单击“程序集信息”并设置“使程序集 COM 可见” 在构建选项卡上:将平台目标设置为 x86 在签名选项卡上:Select“对程序集签名”并创建一个名为“StrongSimpleCom”的新强名称密钥文件,无密码保护

这是JustOne.cs代码:

using System.Runtime.InteropServices;

namespace SimpleCom
{
  [Guid("EAA4976A-45C3-4BC5-BC0B-E47474C3C83F")]
  public interface IJustOne
  {
    [DispId(1)]
    string AddName(string name);
  }

  [Guid("0D53A3E8-E51A-49C7-BC0B-E47474C3C83F"),
      ClassInterface(ClassInterfaceType.None)]
  public class JustOne : IJustOne
  {
    public JustOne() { }

    public string AddName(string name)
    { return "My name is: " + name; }

  }
}

在目标机器上注册 32 位程序集: 从管理命令提示符导航到 DLL 文件夹 C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe SimpleCom.dll /codebase /tlb:myTlb.tlb 我使用 /codebase 是因为如果我将我的 DLL 放在 GAC 中,我还不知道如何调用第三方 DLL。我真的不明白 tlb 文件一旦注册是什么。我想知道是否有人可以告诉我。 此时,COM 对象出现在 Visual Studio 中,但我不能那样调用它,我理解这一点。它只是告诉我它至少在某种意义上是注册的。 所以我认为我应该能够调用我从 32 位 C# 应用程序编写的 32 位 C# DLL。但我就是不知道该怎么做。我似乎甚至找不到使用调用的好例子。我非常感谢有关如何在简单应用程序中调用“IJustOne”的帮助。

一旦成功,我可以添加一些注册表项以使其脱离进程并将 32 位应用程序变成 64 位应用程序。这是我听说过的一种修改注册表以生成进程的 32 位 COM 并使用 DLLhost 作为代理项的方法。

Techtalk.gfi.com 2009 年的方法* 导航至:HKEY_CLASSES_ROOT\WOW6432Node\CLSID{EAA4976A ....} • 添加“AppID”并将值设置为 Guid 导航至:HKEY_CLASSES_ROOT\WOW6432Node\AppID • 使用 Guid 作为名称创建一个新密钥 • 在密钥中,添加没有值的“DllSurrogate” 导航至:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID • 使用 Guid 作为名称创建一个新密钥

我再次无法找到有关如何调用 COM 对象的直接示例。我已经创建了一个 C# DLL 包装器,我可以直接将其包含在一个简单的 C# 32 位应用程序中,因此我很乐意包装非托管的第 3 方 DLL。我想知道如何确保我的包装器 DLL 可以找到他们的 DLL。

我不知道我在注册 DLL 时做错了什么,我也不知道如何在 64 位应用程序或 32 位应用程序中调用它。我感谢任何帮助。我花了几天时间试图追查这个问题,但最后,我的知识库还不够强大。但回顾一下大局: 我正在使用第 3 部分 32 位非托管 DLL。我需要从我的 64 位 C# 应用程序中调用它。我相信这样做的方法是将它包装在一个托管的 C# 32 位 DLL 包装器中,并使其成为一个使用 DLLhost 作为代理的进程外 COM 对象。

再次感谢,

戴夫

Simon 在上面指出了我正确的方向。我的 DLL 注册得很好。我通过组件服务将它添加为组件,之后一切正常。谢谢西蒙。