我正致力于为某些软件提供可靠的.NET互操作,通过COM为第三方开发人员提供非托管API。
以前该软件仅支持VBScript进行第三方开发,因此他们已经习惯于添加新方法和可选参数来修复API中的功能问题。
然而,在.NET中,添加可选参数构成了一个重大变化(因为方法签名已经改变)。如果API在.NET中,这可以通过使用重载方法轻松解决,但是因为API是非托管的,我们使用COM接口,因此我不能使用重载。
我对API更改政策没有任何影响
我考虑过的事情,但没有随处可见:
使用Reflection Emit在运行时添加重载 - 据我所知,只有动态创建整个程序集才能实现;鉴于API是一个typelib / COM而不是真正的.NET程序集,可能无法实现。
捕获和重新路由调用错误 - 当“命中”可选参数时,错误包含使用可选参数将旧方法重定向到新方法所需的所有信息。不幸的是,我的理解是,一旦出现错误,你就无法返回。
包装类型库 - 我可以提前知道API方法是否添加了可选参数。因此,我看看是否可以以某种方式为类型库添加重载,或者可能将整个类型库包装在.NET代理中,其中包含重载方法以在前/后可选参数方法之间进行转换。但如果可以做到,我真的找不到办法。
欢迎所有建议 - 我在这里非常绝望!
n.b。 .NET可以添加新方法,只是添加了导致我麻烦的可选参数。另外,我正在用VB.NET编写,但如果它能让事情变得更容易,可以很高兴地用C#编写代码。
答案 0 :(得分:1)
尝试使用Alias关键字为每个参数配置声明一次该函数。
Declare Function functionName1 Lib "libName" Alias "libFunctionName" (parameter configuration 1)
Declare Function functionName2 Lib "libName" Alias "libFunctionName" (parameter configuration 2)
...
然后根据调用中使用的参数调用相应的函数。