C# - 注册 COM 可见类所需的依赖DLL?

3
我有一个C#库,是公司内部开发的,提供了一个接口给我们的旧软件使用。随着时间的推移,需求不断增长,现在我需要为这个接口库添加COM可见性,以便从像MS Office应用程序中的VBA这样的应用程序中访问它。
更新3:在“现有设计”文本中添加了更多细节。 现有设计: 我们称我的接口库为Interface.dll。它是一个外观模式,包括一些后端/dlls,这些都是Interface.dll的依赖项。我们称它们为:MyTypeLib.dll,MyHelper1.dll,MyHelper2.dll和几个其他帮助程序。上述每个.dll都是解决方案中的一个单独的库项目。 我的方法是:
开发一个新库,其中包含一个COM可见类。我做了如下操作:
更新1、2:添加了我的接口示例代码。
[Guid("CE3750B7-DE31-4635-A69C-110B1271B363")]
public interface ICOMVisibleClass
{
   ...
   ...
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("A023101A-D9B3-4A24-AAE4-B3CFEDA04BAF")]
public class MyCOMVisibleClass : ICOMVisibleClass
{
   ...
   ...
}

您需要从Interface.dll中选择性地调用方法,使这些选定的方法成为COM可见。假设上述类生成了MyCOMVisibleClassLib.dll。我使用RegAsm.exe注册此库并生成MyCOMVisibleClassLib.tlb文件。

为了测试这个实现,我决定使用MS Excel 2010。我打开了VBA编辑器,并添加了对MyCOMVisibleClassLib.tlb的引用。在代码中,我现在可以看到所有在MyCOMVisibleClass中的方法,所以它似乎工作正常,直到......

我运行了这段代码,得到了“运行时错误-2146233088(80131500)。无法找到MyTypeLib.dll”的提示。我使用程序集绑定日志查看器查看了更多有关此错误的详细信息,并发现MS Excel在除实际文件所在位置之外的任何地方寻找此文件(MyTypeLib.dll)。如果我将此文件复制到Program Files下的Excel安装文件夹中,Excel会抱怨下一个依赖项-MyHelper1.dll等等。当我将所有dll文件复制到Excel安装文件夹后,一切都很好。但这不是我要寻找的解决方案。

问题:

  1. 我的方法正确吗?
  2. 我认为只需要注册MyCOMVisibleClassLib.dll。我这样想对吗?
  3. 如何使Excel找到所有我的依赖项(MyTypeLib.dll,MyHelper1.dll,MyHelper2.dll),而无需将它们复制到MS Excel安装文件夹中?

我还认为我缺少一些基本的知识,我在开始之前应该知道这些,但似乎无法弄清楚。

非常感谢您的帮助。提前致谢。


抱歉@silverspoon,这可能是一个愚蠢的问题,但我没有看到您实际上正在实现您的接口。您能确认一下您的MyComVisibleClass是否实际上实现了您的接口吗?即MyComVisibleClass:Interface。请参见此处作为示例。并且很高兴看到您实际上如何定义依赖项-您能详细说明一下吗? - user2140173
1
.Net融合引擎从以下位置加载库:
  • Temp -> download -> gac -> 基本路径 -> 探测路径。
由于您正在使用Excell作为进程所有者,因此它将使用'excell.exe'位置作为基本路径和配置根目录。您有一个选项是签署您的程序集并将它们放入GAC。另一个选项是将.Net配置放置在excell目录中,并为您的程序集指定“探测路径”(必须是excell路径的子目录)。希望这可以帮助到您。
- Marvin Smit
@mehow,我已经更新了代码,以显示我的COM Visible类的接口。我不太确定你在第二个问题中想表达什么意思。我的库(Interface.dll)使用其他一些dll(MyTypeLib.dll、MyHelper1.dll、MyHelper2.dll等)用于类型、辅助方法、日志记录等。这是你想要知道的吗?如果我误解了你的问题,对不起。 - silverspoon
1
你在 regasm 命令中使用了 /codebase 参数吗? - Joel Lucsy
@mehow,上述每个.dll都是我的解决方案中的单独库项目。是的,接口库引用了所有依赖项。我会尝试您的建议并使用新的GUID。谢谢并为我的描述不够清晰道歉。我现在会进行更新。 - silverspoon
显示剩余2条评论
1个回答

4

我终于处理好了这个问题。这是我的解决方法:

  1. 对所有程序集进行强名称和签名,包括需要注册的程序集。
  2. 使用RegAsm生成.tlb文件。这里有一个要点——如果你要为64位版本部署解决方案(就像我一样,我将使用这个接口来与64位MS Excel交互),你必须使用位于“C:\Windows\Microsoft.NET\Framework64”下的64位版本的RegAsm来创建.tlb文件。对于32位解决方案,请使用位于“C:\Windows\Microsoft.NET\Framework”文件夹中的RegAsm。
  3. 在VS2010中创建一个设置项目,将输出从MyCOMVisibleClassLib项目、它的所有依赖项和MyCOMVisibleClassLib.tlb文件包含在内。

你可以将所有这些文件安装在GAC中,除了.tlb文件。所以我选择在应用程序文件夹(位于Program Files下)中安装。

运行设置后一切都很顺利,Excel现在似乎能正确地找到这些文件了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接