首页 > 解决方案 > 无法从 64 位 C# 应用程序调用 C# 32 位 Com

问题描述

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

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

第一步是创建 32 位 COM 包装器。此时,我的示例代码不包含任何内容。它只有一个简单的功能。以下是我创建 DLL 的步骤:

新建C#、windows、类库(.Net Framework)、.NET Framework 4

将项目命名为“SimpleCom”,将类和CS文件重命名为“JustOne”</p>

在项目属性中: 在应用程序选项卡上:单击“程序集信息”并设置“使程序集 COM-Visible” 在构建选项卡上:将平台目标设置为 x86 在签名选项卡上:选择“签署程序集”并创建一个新的强名称密钥文件命名为“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。但我就是不知道该怎么做。我似乎找不到使用调用的好例子。

一旦成功,我可以添加一些注册表项以使其脱离进程并将 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 位应用程序中调用它。我感谢任何帮助。我花了几天时间试图追查这个问题,但最后,我的知识基础还不够强大。但回顾一下大局:我正在使用第三部分 32 位非托管 DLL。我需要从我的 64 位 C# 应用程序中调用它。我相信这样做的方法是将其包装在托管的 C# 32 位 DLL 包装器中,并使其成为使用 DLLhost 作为代理的进程外 COM 对象。

再次感谢,

戴夫

标签: c#.netdllcom

解决方案


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


推荐阅读