簡體   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