我有一个C#库,是公司内部开发的,提供了一个接口给我们的旧软件使用。随着时间的推移,需求不断增长,现在我需要为这个接口库添加COM可见性,以便从像MS Office应用程序中的VBA这样的应用程序中访问它。
更新3:在“现有设计”文本中添加了更多细节。 现有设计: 我们称我的接口库为Interface.dll。它是一个外观模式,包括一些后端/dlls,这些都是Interface.dll的依赖项。我们称它们为:MyTypeLib.dll,MyHelper1.dll,MyHelper2.dll和几个其他帮助程序。上述每个.dll都是解决方案中的一个单独的库项目。 我的方法是:
开发一个新库,其中包含一个COM可见类。我做了如下操作:
更新1、2:添加了我的接口示例代码。
更新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安装文件夹后,一切都很好。但这不是我要寻找的解决方案。
问题:
- 我的方法正确吗?
- 我认为只需要注册MyCOMVisibleClassLib.dll。我这样想对吗?
- 如何使Excel找到所有我的依赖项(MyTypeLib.dll,MyHelper1.dll,MyHelper2.dll),而无需将它们复制到MS Excel安装文件夹中?
我还认为我缺少一些基本的知识,我在开始之前应该知道这些,但似乎无法弄清楚。
非常感谢您的帮助。提前致谢。
MyComVisibleClass
是否实际上实现了您的接口吗?即MyComVisibleClass:Interface
。请参见此处作为示例。并且很高兴看到您实际上如何定义依赖项-您能详细说明一下吗? - user2140173