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
再用C#写一个包含DVBusinessCom.dll里面方法的dll,放到同路径下,然后反射.NET版本的dll
#2
这样做的话没什么意义了啊,我想的能够动态加载DLL文件里面的方法,我写个方法只需要知道方法名参数,然后让她自己去dll文件里面找到那个方法。。!~
#3
没错啊,就是这样啊,又没叫你用C#重新实现一遍,只是用C#做一层包装而已
#4
C#反射不了C++ dll,只能DllImport调用C++ dll
#5
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中的动态类型对象
对于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
是不是思路不对?
对于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
再用C#写一个包含DVBusinessCom.dll里面方法的dll,放到同路径下,然后反射.NET版本的dll
#2
直接反射C++写的Dll是反射不了的。
再用C#写一个包含DVBusinessCom.dll里面方法的dll,放到同路径下,然后反射.NET版本的dll
这样做的话没什么意义了啊,我想的能够动态加载DLL文件里面的方法,我写个方法只需要知道方法名参数,然后让她自己去dll文件里面找到那个方法。。!~
#3
直接反射C++写的Dll是反射不了的。
再用C#写一个包含DVBusinessCom.dll里面方法的dll,放到同路径下,然后反射.NET版本的dll
这样做的话没什么意义了啊,我想的能够动态加载DLL文件里面的方法,我写个方法只需要知道方法名参数,然后让她自己去dll文件里面找到那个方法。。!~
没错啊,就是这样啊,又没叫你用C#重新实现一遍,只是用C#做一层包装而已
#4
C#反射不了C++ dll,只能DllImport调用C++ dll
#5
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中的动态类型对象
对于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
是不是思路不对?
对于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中的动态类型对象
试了下,果然这个可以,谢谢!~结贴了。。