从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">

在项目属性中:在"应用程序"选项卡上:单击";装配信息";并设置"使程序集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.30119\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组成为进程并使用DLL主机作为代理的方法之一。

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

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

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

再次感谢

Dave

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

最新更新