以前在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”
     }
}求答案。。