我正在使用 .NET 4.0 和动态在运行时调用 System.__ComObject 上的成员。我通过以下方式实例化该对象:
dynamic DrApi;
DrApi = Activator.CreateInstance(SprImportedTypes.DrApi);
这些类型在静态类中声明,如下所示:
internal static Type DrApi = Type.GetTypeFromProgID("DrApi.DrApi.1");
由于对象是动态的,我可以毫无困难地调用方法:
string vers = string.Empty;
DrApi.Version(ref vers);
为了整合和本地化错误处理,我试图有一个可用于调用该对象上的方法的例程。大多数方法都需要 ref/out 参数,因此我当前返回一个从反射返回的值的对象数组:
public object[] Run(string method, params object[] args)
{
var p = new ParameterModifier(args.Length);
for (int i = 0; i < args.Length; i++)
p[i] = true;
ParameterModifier[] mods = { p };
SprImportedTypes.DrApi.InvokeMember(method, BindingFlags.InvokeMethod,
null, DrApi, args, mods, null, null));
return args;
}
虽然这有效,但我没有获得有关我正在调用的方法的任何信息,因此我不能 100% 放心地通过引用设置所有参数。
这是我尝试过但不起作用的方法:
MethodInfo mInfo = SprImportedTypes.DrApi.GetMethod(methodName, BindingFlags.Instance |
BindingFlags.NonPublic | BindingFlags.Static);
以下是 OLE TypeLib Viewer 中的方法:
[id(0x00000009), helpstring("method Version")]
HRESULT Version(
[in, out] BSTR* VersionString,
[out, retval] long* pReturnValue);
该类实现了一个接口,该接口本身实现了 IDispatch,并且该方法是 HRESULT,所以我无法弄清楚为什么它从不返回任何内容。