我有一个内部开发的 C# 库,用于为我们的旧软件提供接口。随着时间的推移,需求不断增长,现在我将在此接口库中添加 COM 可见性,以便可以从 MS Office 应用程序中的 VBA 之类的东西访问它。
更新 3:在“现有设计”文本中添加了更多细节。
现有设计: 让我们将我的接口库称为Interface.dll。这是一个外观模式,其中包括一些后端 /dll,它们是此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 安装文件夹后,一切都很好。但这不是我正在寻找的解决方案。
问题:
- 我的方法对 COM 开放一些方法是否正确?
- 我认为MyCOMVisibleClassLib.dll是唯一需要注册的。我这样想对吗?
- 如何让 Excel 找到我的所有依赖项(MyTypeLib.dll、MyHelper1.dll、MyHelper2.dll)而无需将它们复制到 MS Excel 安装文件夹中?
我还认为我错过了一些基本的东西,在我开始之前我应该知道但似乎无法弄清楚。
很感谢任何形式的帮助。提前致谢。