我正致力于通过 COM 为第三方开发人员提供一些具有非托管 API 的软件的可靠 .NET 互操作性。
以前该软件仅支持第三方开发的 VBScript,因此他们已经习惯了能够添加新方法和可选参数来修复 API 中的功能问题。
然而,在 .NET 中,添加可选参数会构成重大更改(因为方法签名已更改)。如果 API 在 .NET 中,这可以通过使用重载方法轻松解决,但是由于 API 是非托管的,我们使用的是 COM 接口,因此我不能使用重载。
我对 API 变更政策没有任何影响
我考虑过的事情,但没有得到任何结果:
使用反射发射在运行时添加重载-据我所知,只有动态创建整个程序集才能做到这一点;考虑到 API 是 typelib/COM 而不是真正的 .NET 程序集,这可能是不可能的。
捕获并重新路由调用错误- 当可选参数被“命中”时,错误具有将旧方法重定向到具有可选参数的新方法所需的所有信息。不幸的是,我的理解是,一旦抛出错误,您将无法返回。
包装类型库- 我将能够提前知道 API 方法何时添加了可选参数。因此,我想看看是否可以以某种方式向 typelib 添加重载,或者可能将整个 typelib 包装在 .NET 代理中,其中包含重载方法以在前/后可选参数方法之间进行转换。但如果能做到,我真的找不到办法。
欢迎所有建议 - 我在这里变得非常绝望!
nb .NET 可以很好地添加新方法,只是添加可选参数给我带来了麻烦。此外,我正在用 VB.NET 编写代码,但如果它使事情变得更容易,我可以愉快地用 C# 等编写代码。