从c#调用VB DLL的方法

本文关键字:方法 DLL VB 调用 | 更新日期: 2023-09-27 17:54:51

我正在尝试使用以下代码从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]{系统。Object GetData(System.Object)} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [2] {Boolean SetDataSystem.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [3] {Void ReleaseAllData()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [4]{系统。对象GetEventProvider(System.Type)} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [5] {Int32 releasesself ()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [6] {Void finalreleasesself ()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [7]{系统。对象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]{系统。对象InvokeMember(系统。字符串,System.Reflection。BindingFlags System.Reflection。粘结剂体系。对象[],System.Reflection。System.Globalization ParameterModifier[]。CultureInfo, System.String[])} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [11]{系统。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]{系统。对象GetLifetimeService()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [15]{系统。对象InitializeLifetimeService()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [16] {System.Runtime.Remoting。ObjRef CreateObjRef(System.Type)} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [17] {Boolean canasttoxmltype (System. type)。System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [18]{系统。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]{系统。GetType()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [22] {Void Finalize()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}
  • [23]{系统。Object MemberwiseClone()} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}

从c#调用VB DLL的方法

如果指定一个COM ProgID,则从GetTypeFromProgID获得的类型实际上总是内部的。net框架类型System.__ComObject,它用于实现COM互操作运行时可调用包装器,通过该包装器,托管代码可以使用非托管COM对象的方法。

这个类型的方法,你可以通过反射找到,是这个托管类型的托管方法,而不是由包装的COM对象实现的非托管方法。因此,您的问题中列出的24种方法都是System.__ComObject类型的方法。

您可以从COM对象的非托管COM方法中找到的内容受到COM机制的限制。一般来说,在使用COM时,在调用对象上的任何方法之前,您必须知道要使用什么接口,以及它的需求是什么。如果存在关联的类型库,则可以在其中获取方法的元数据,但如果没有,则尝试做不可能的事情。

如果你能解释为什么你试图通过发现MethodInfo对象来调用COM对象,而不是使用从COM服务器的类型库生成的互操作程序集的正常方法,也许我们可以进一步帮助。