3

我正致力于通过 COM 为第三方开发人员提供一些具有非托管 API 的软件的可靠 .NET 互操作性。

以前该软件仅支持第三方开发的 VBScript,因此他们已经习惯了能够添加新方法和可选参数来修复 API 中的功能问题。

然而,在 .NET 中,添加可选参数会构成重大更改(因为方法签名已更改)。如果 API 在 .NET 中,这可以通过使用重载方法轻松解决,但是由于 API 是非托管的,我们使用的是 COM 接口,因此我不能使用重载。

我对 API 变更政策没有任何影响

我考虑过的事情,但没有得到任何结果:

  • 使用反射发射在运行时添加重载-据我所知,只有动态创建整个程序集才能做到这一点;考虑到 API 是 typelib/COM 而不是真正的 .NET 程序集,这可能是不可能的。

  • 捕获并重新路由调用错误- 当可选参数被“命中”时,错误具有将旧方法重定向到具有可选参数的新方法所需的所有信息。不幸的是,我的理解是,一旦抛出错误,您将无法返回。

  • 包装类型库- 我将能够提前知道 API 方法何时添加了可选参数。因此,我想看看是否可以以某种方式向 typelib 添加重载,或者可能将整个 typelib 包装在 .NET 代理中,其中包含重载方法以在前/后可选参数方法之间进行转换。但如果能做到,我真的找不到办法。

欢迎所有建议 - 我在这里变得非常绝望!

nb .NET 可以很好地添加新方法,只是添加可选参数给我带来了麻烦。此外,我正在用 VB.NET 编写代码,但如果它使事情变得更容易,我可以愉快地用 C# 等编写代码。

4

1 回答 1

1

尝试使用 Alias 关键字为每个参数配置声明一次函数。

Declare Function functionName1 Lib "libName" Alias "libFunctionName" (parameter configuration 1)
Declare Function functionName2 Lib "libName" Alias "libFunctionName" (parameter configuration 2)
...

然后根据调用中使用的参数调用相应的函数。

于 2013-08-25T04:25:15.533 回答