从C#调用VB DLL上的方法

时间:2011-05-05 16:52:44

标签: c# com com-interop

我正在尝试使用以下代码从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] {IntPtr GetIUnknown(Boolean ByRef)} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [1] {System.Object GetData(System.Object)} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [2] {Boolean SetData(System.Object,System.Object)} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [3] {Void ReleaseAllData()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [4] {System.Object GetEventProvider(System.Type)} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [5] {Int32 ReleaseSelf()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [6] {Void FinalReleaseSelf()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [7] {System.Object CreateEventProvider(System.Type)} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [8] {IntPtr GetComIUnknown(Boolean)} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [9] {Boolean IsInstanceOfType(System.Type)} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [10] {System.Object InvokeMember(System.String,System.Reflection.BindingFlags,System.Reflection.Binder,System.Object [],System.Reflection.ParameterModifier [],System.Globalization.CultureInfo,System。 String [])} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [11] {System.MarshalByRefObject MemberwiseClone(Boolean)} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [12] {System.Runtime.Remoting.ServerIdentity __RaceSetServerIdentity(System.Runtime.Remoting.ServerIdentity)} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [13] {Void __ResetServerIdentity()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [14] {System.Object GetLifetimeService()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [15] {System.Object InitializeLifetimeService()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [16] {System.Runtime.Remoting.ObjRef CreateObjRef(System.Type)} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [17] {Boolean CanCastToXmlType(System.String,System.String)} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [18] {System.String ToString()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [19] {Boolean Equals(System.Object)} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [20] {Int32 GetHashCode()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [21] {System.Type GetType()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [22] {Void Finalize()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [23] {System.Object MemberwiseClone()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}

1 个答案:

答案 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程序集的常规方法,也许我们可以进一步提供帮助。