【发布时间】:2013-07-26 12:02:43
【问题描述】:
我正致力于通过 COM 为第三方开发人员通过非托管 API 为某些软件提供可靠的 .NET 互操作。
以前该软件仅支持第三方开发的 VBScript,因此他们已经习惯了能够添加新方法和可选参数来修复 API 中的功能问题。
然而,在 .NET 中,添加可选参数会构成重大更改(因为方法签名已更改)。如果 API 在 .NET 中,这可以通过使用重载方法轻松解决,但是由于 API 是非托管的,我们使用的是 COM 接口,因此我不能使用重载。
我对 API 变更政策没有任何影响
我考虑过但没有得到任何结果的事情:
使用反射发射在运行时添加重载 - 据我所知,只有动态创建 whole 程序集才能做到这一点;考虑到 API 是 typelib/COM 而不是真正的 .NET 程序集,这可能是不可能的。
捕获并重新路由调用错误 - 当可选参数被“命中”时,错误包含将旧方法重定向到带有可选参数的新方法所需的所有信息。不幸的是,我的理解是,一旦抛出错误,您将无法返回。
包装类型库 - 我将能够提前知道 API 方法何时添加了可选参数。因此,我一直在寻找是否可以以某种方式向 typelib 添加重载,或者可能将整个 typelib 包装在 .NET 代理中,其中包含重载方法以在可选参数方法之前/之后进行转换。但如果能做到,我真的找不到办法了。
欢迎所有建议 - 我在这里变得非常绝望!
n.b. .NET 可以很好地添加新方法,只是添加可选参数给我带来了麻烦。另外,我正在用 VB.NET 编写代码,但如果它使事情变得更容易,我可以愉快地用 C# 等编写代码。
【问题讨论】:
-
这不是我的专业领域,但 Office 互操作不是在其 API 中使用可选参数吗?你可以看看他们是如何处理的。
-
Office PIA 拥有比我多得多的资源,并为每个 Office 版本提供不同的程序集,他们维护这些程序集——我怀疑我是否能够做到这一点而不会失去我还剩下的那一点点头发明白了!
-
我有一个项目,我有一些非托管 c++ 代码,其中包含安全的变体数组,我需要与 vb.net 互操作。它最初使用的是 vbscript。我什至无法编写 c++ 包装器,因为我不知道如何初始化 safearray 以使 fFeatures 为 2194,因此 com 代码可以正常工作。希望您不会在其中一种情况下使用安全的变体数组(解决问题后您将希望快速离开)。我几乎会用 c# 编写任何需要变体的东西,或者编写你自己的 c++ 变体包装器。太糟糕了,你没有列出任何我会提供帮助的代码。
标签: .net vb.net api com typelib