我正在尝试使用以下代码从C#调用vb dll(com):
Type t = Type.GetTypeFromProgID("DLLName",true);
Object o = Activator.CreateInstance(t);
//object f = Activator.CreateInstance(z);
MethodInfo[] m = t.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
但是我没有看到DLL中公开的方法。我已经尝试了各种BindingFlags组合,如静态,公共,非公共,实例等。相反,我只是看到这些方法暴露。任何人都可以帮我确定为什么我无法看到这些方法?感谢。
答案 0 :(得分:2)
如果指定COM ProgID,则从GetTypeFromProgID获取的Type实际上始终是内部.NET Framework类型System.__ComObject
,用于实现托管代码可以使用非托管的COM Interop Runtime Callable Wrapper COM对象的方法。
您可以通过Reflection找到的此类型的方法是此托管类型的托管方法,而不是由包装的COM对象实现的非托管方法。因此,您问题中列出的24种方法是System.__ComObject
类型的方法。
您受限于COM的机制,您可以了解有关COM对象的非托管COM方法的内容。通常,在使用COM时,您必须先了解要使用的接口及其要求,然后才能调用对象上的任何方法。如果存在关联的类型库,那么您可以在其中获取方法的元数据,但如果没有,则尝试执行不可能的操作。
如果您可以通过发现MethodInfo对象来解释为什么要尝试调用COM对象,而不是使用从COM服务器的类型库生成的Interop程序集的常规方法,也许我们可以进一步提供帮助。