繁体   English   中英

无法从 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、类库(.Net Framework)、.NET Framework 4

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

在项目属性中: 在应用程序选项卡上:单击“程序集信息”并设置“使程序集 COM 可见”在构建选项卡上:将平台目标设置为 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。 但我就是不知道该怎么做。 我似乎找不到使用 invoke 的好例子。 我非常感谢有关如何在简单应用程序中调用“IJustOne”的帮助。

一旦成功,我可以添加一些注册表项以使其退出进程并使 32 位应用程序成为 64 位应用程序。 这是我听说的修改注册表以生成 32 位 COM oup 进程并使用 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 位应用程序中,因此我可以轻松地包装非托管的 3rd 方 DLL。 我想知道如何确保我的包装 DLL 可以找到它们的 DLL。

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

再次感谢,

戴夫

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM