winfrom用反射获取C++写的dll文件应该如何去调用???

时间:2021-05-28 01:00:19
//这个是反射查找的C#写的com组件,没问题。可以找到。
assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "MyLib.dll");
//但是这个调用C++写的com组件就不行了,C++com组件在debug下是叫 DVBusinessCom.dll但是我试了下引用的话,引用在项目当中它会在项目当中自己就多了个lib成DVBusinessComLib所以查找不到。
assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "DVBusinessCom.dll");
 还请各位大神给支个招!~~

7 个解决方案

#1


直接反射C++写的Dll是反射不了的。
再用C#写一个包含DVBusinessCom.dll里面方法的dll,放到同路径下,然后反射.NET版本的dll

#2


引用 1 楼 vb763305825 的回复:
直接反射C++写的Dll是反射不了的。
再用C#写一个包含DVBusinessCom.dll里面方法的dll,放到同路径下,然后反射.NET版本的dll

 这样做的话没什么意义了啊,我想的能够动态加载DLL文件里面的方法,我写个方法只需要知道方法名参数,然后让她自己去dll文件里面找到那个方法。。!~

#3


引用 2 楼 u013063561 的回复:
Quote: 引用 1 楼 vb763305825 的回复:

直接反射C++写的Dll是反射不了的。
再用C#写一个包含DVBusinessCom.dll里面方法的dll,放到同路径下,然后反射.NET版本的dll

 这样做的话没什么意义了啊,我想的能够动态加载DLL文件里面的方法,我写个方法只需要知道方法名参数,然后让她自己去dll文件里面找到那个方法。。!~

没错啊,就是这样啊,又没叫你用C#重新实现一遍,只是用C#做一层包装而已

#4


C#反射不了C++ dll,只能DllImport调用C++ dll

#5


引用 4 楼 lovelj2012 的回复:
C#反射不了C++ dll,只能DllImport调用C++ dll


  //声明一个反射类对象
                    Assembly assembly;
                    //让这个对象加载某个外部dll程序集信息.
                    //assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "MyLib.dll");
                    assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "DVBusinessCom.dll");
                    //Assembly.
                    //定义一个"类型信息"的对象.
                    Type type = assembly.GetType("MyLib.Class1", false, true);
                    //定义一个成员信息类对象数组,并从程序集中获取.
                    MemberInfo[] info = type.GetMembers();
                    //定义一个成员方法对象,这里是指定方法名称来获取的.
                    MethodInfo method = type.GetMethod(args[0]);
                    List<object> result = new List<object>();
                    for (int i = 1; i < args.Length; i++)
                    {
                        result.Add(int.Parse(args[i]));
                    }
                    object[] arg = result.ToArray();
                    //创建类的实例
                    object instance = assembly.CreateInstance("MyLib.Class1");
                    int s = (int)method.Invoke(instance, arg);
           
Console.Write("返回值为:"+s).ToString());

类似这种的功能,,我改怎么实现呢?

#6


是不是思路不对?
对于COM组件,都有一个公开的组件类名(在注册表的HKEY_CLASSES_ROOT下),以及关联的ProgID(GUID形式的唯一标识),有了它,就可以从ROT(运行对象表)获取一个COM对象指针,并调用功能函数

VB是弱类型的,所以不需要反射,只需要GetObjet(,"COM类名")就行,C#中对应的方法是Marshal.GetActiveObject()
http://[url=http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.marshal.getactiveobject(v=vs.80).aspx][/url]
或者是
type = System.Type.GetTypeFromCLSID(GUID) 也就是你上面要反射的类型
appComObject = Activator.CreateInstance(type)
还是用弱类型对象避开类型检查方便点(COM编程的一个缺点),比如用VB.Net或者C#4.0中的动态类型对象

#7


引用 6 楼 dongxinxi 的回复:
是不是思路不对?
对于COM组件,都有一个公开的组件类名(在注册表的HKEY_CLASSES_ROOT下),以及关联的ProgID(GUID形式的唯一标识),有了它,就可以从ROT(运行对象表)获取一个COM对象指针,并调用功能函数

VB是弱类型的,所以不需要反射,只需要GetObjet(,"COM类名")就行,C#中对应的方法是Marshal.GetActiveObject()
http://[url=http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.marshal.getactiveobject(v=vs.80).aspx][/url]
或者是
type = System.Type.GetTypeFromCLSID(GUID) 也就是你上面要反射的类型
appComObject = Activator.CreateInstance(type)
还是用弱类型对象避开类型检查方便点(COM编程的一个缺点),比如用VB.Net或者C#4.0中的动态类型对象

 试了下,果然这个可以,谢谢!~结贴了。。

#1


直接反射C++写的Dll是反射不了的。
再用C#写一个包含DVBusinessCom.dll里面方法的dll,放到同路径下,然后反射.NET版本的dll

#2


引用 1 楼 vb763305825 的回复:
直接反射C++写的Dll是反射不了的。
再用C#写一个包含DVBusinessCom.dll里面方法的dll,放到同路径下,然后反射.NET版本的dll

 这样做的话没什么意义了啊,我想的能够动态加载DLL文件里面的方法,我写个方法只需要知道方法名参数,然后让她自己去dll文件里面找到那个方法。。!~

#3


引用 2 楼 u013063561 的回复:
Quote: 引用 1 楼 vb763305825 的回复:

直接反射C++写的Dll是反射不了的。
再用C#写一个包含DVBusinessCom.dll里面方法的dll,放到同路径下,然后反射.NET版本的dll

 这样做的话没什么意义了啊,我想的能够动态加载DLL文件里面的方法,我写个方法只需要知道方法名参数,然后让她自己去dll文件里面找到那个方法。。!~

没错啊,就是这样啊,又没叫你用C#重新实现一遍,只是用C#做一层包装而已

#4


C#反射不了C++ dll,只能DllImport调用C++ dll

#5


引用 4 楼 lovelj2012 的回复:
C#反射不了C++ dll,只能DllImport调用C++ dll


  //声明一个反射类对象
                    Assembly assembly;
                    //让这个对象加载某个外部dll程序集信息.
                    //assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "MyLib.dll");
                    assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "DVBusinessCom.dll");
                    //Assembly.
                    //定义一个"类型信息"的对象.
                    Type type = assembly.GetType("MyLib.Class1", false, true);
                    //定义一个成员信息类对象数组,并从程序集中获取.
                    MemberInfo[] info = type.GetMembers();
                    //定义一个成员方法对象,这里是指定方法名称来获取的.
                    MethodInfo method = type.GetMethod(args[0]);
                    List<object> result = new List<object>();
                    for (int i = 1; i < args.Length; i++)
                    {
                        result.Add(int.Parse(args[i]));
                    }
                    object[] arg = result.ToArray();
                    //创建类的实例
                    object instance = assembly.CreateInstance("MyLib.Class1");
                    int s = (int)method.Invoke(instance, arg);
           
Console.Write("返回值为:"+s).ToString());

类似这种的功能,,我改怎么实现呢?

#6


是不是思路不对?
对于COM组件,都有一个公开的组件类名(在注册表的HKEY_CLASSES_ROOT下),以及关联的ProgID(GUID形式的唯一标识),有了它,就可以从ROT(运行对象表)获取一个COM对象指针,并调用功能函数

VB是弱类型的,所以不需要反射,只需要GetObjet(,"COM类名")就行,C#中对应的方法是Marshal.GetActiveObject()
http://[url=http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.marshal.getactiveobject(v=vs.80).aspx][/url]
或者是
type = System.Type.GetTypeFromCLSID(GUID) 也就是你上面要反射的类型
appComObject = Activator.CreateInstance(type)
还是用弱类型对象避开类型检查方便点(COM编程的一个缺点),比如用VB.Net或者C#4.0中的动态类型对象

#7


引用 6 楼 dongxinxi 的回复:
是不是思路不对?
对于COM组件,都有一个公开的组件类名(在注册表的HKEY_CLASSES_ROOT下),以及关联的ProgID(GUID形式的唯一标识),有了它,就可以从ROT(运行对象表)获取一个COM对象指针,并调用功能函数

VB是弱类型的,所以不需要反射,只需要GetObjet(,"COM类名")就行,C#中对应的方法是Marshal.GetActiveObject()
http://[url=http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.marshal.getactiveobject(v=vs.80).aspx][/url]
或者是
type = System.Type.GetTypeFromCLSID(GUID) 也就是你上面要反射的类型
appComObject = Activator.CreateInstance(type)
还是用弱类型对象避开类型检查方便点(COM编程的一个缺点),比如用VB.Net或者C#4.0中的动态类型对象

 试了下,果然这个可以,谢谢!~结贴了。。