C# 通过反射调用C++ 动态库的问题。。。
以前在C#里调用C++的DLL里的方法,都是在“引用”里把这个DLL引用到项目,然后在代码里创建出这个DLL的对象,再调用相应的方法,代码如下://调用Run方法时,需要把一个字符串传进去。根据C++动态库的提供人说“Run 方法的参数是一个char数组”
monitor_dll.monitor m = new monitor_dll.monitor();
sbyte[] sbArray = (sbyte[])((Array)System.Text.Encoding.Default.GetBytes("test"));
unsafe
{
fixed (sbyte* sb = sbArray)
{
m.Run(sb);
}
}
以上代码是可以正确运行的
现在项目需要改成通过反射调用,在调用Run方法的时候却不知怎么传参数了。以下是新改的代码。。
Assembly assembly = Assembly.Load("monitor_dll");
object o = assembly.CreateInstance("monitor_dll.monitor",true,
BindingFlags.CreateInstance,null,null,null,null);
MethodInfo method = o.GetType().GetMethod("Run");
//调用1
method.Invoke(o, new[] {"test"});
//调用2
char[] msg = "test".ToCharArray();
method.Invoke(o, new[] { msg });
当程序执行到method.Invoke的时候出现以下错误
类型 “System.String”的对象无法转换为类型“System.SByte*”。
类型 “System.Char[]”的对象无法转换为类型“System.SByte*”。
后来根据以前的做法--传指针,但编译时mthod.Invoke就报错,代码如下:
sbyte[] sbArray = (sbyte[])((Array)System.Text.Encoding.Default.GetBytes("test"));
unsafe
{
fixed (sbyte* sb = sbArray)
{
// method.Invoke(o, new[] { sb }); // 无法将类型“sbyte*”隐式转换为“object”
}
}
求答案。。。。。 --------------------编程问答-------------------- 你能反射c++的dll? --------------------编程问答-------------------- 托管代码的dll可以反射,C++是非托管代码 --------------------编程问答--------------------
可以的。。。 --------------------编程问答-------------------- 修正一下、、、
Run 方法的参数是一个 Sbyte* 指针,提供人说C++的Sbyte* 指针就相当 char数组 --------------------编程问答-------------------- 非托管的用 DllImport 引入, Assembly是托管dll --------------------编程问答--------------------
我这个C++的dll是托管的。。。 --------------------编程问答-------------------- 有托管的c++
补充:.NET技术 , C#