当前位置:编程学习 > C#/ASP.NET >>

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++是非托管代码 --------------------编程问答--------------------
引用 1 楼 bdmh 的回复:
你能反射c++的dll?


可以的。。。 --------------------编程问答-------------------- 修正一下、、、

Run 方法的参数是一个 Sbyte* 指针,提供人说C++的Sbyte* 指针就相当 char数组  --------------------编程问答-------------------- 非托管的用 DllImport 引入, Assembly是托管dll --------------------编程问答--------------------
引用 5 楼 bdmh 的回复:
非托管的用 DllImport 引入, Assembly是托管dll


我这个C++的dll是托管的。。。 --------------------编程问答-------------------- 有托管的c++
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,