c#调用c++写的dll 时,c++中有一函数返回值为char*。在c#中相应的数据类型应该用什么类型啊。

作者&投稿:梅些 (若有异议请与网页底部的电邮联系)
c#调用dll,函数返回值为自定义的C++接口指针,如何在C#中定义函数返回值,并调用该接口提供的各个函数?~

类是没有办法,结构体还行。
我原来回答过的一个类似的问题,楼主参考一下:
其实对于dll来说,类的动太导出一直是一个难题。我早先由于项目需要,也了解过一些这方面的知识,最后还是放弃了。
后来我想到了一个方法。
类的实例通过指针传出来,然后在类的基础上再封装一层,每个公开的函数都封一个函数,参数表里直接把创建的类的指针给传进去,在dll内部再调相应的方法。

楼主不妨也这样试一下。

比如: g()这个函数,就返回一个IntPtr。这个指针就是在dll中创建对象的指针,但在C#里不具体的把它分出来是张三还是王二。dll中增加调用a的函数add的全局导出函数 add2(void*) 然后在add2的函数体内对指针进行转化后再调其add方法。

有点迂回敌后的感觉。

还有,既然需要用C#来调用,dll也可以写成托管的,只要加上运行时支持就好了。那样的类声明加个partal,然后直接添加引用就能象用c#的dll一样用了,这个多方便啊?我还试了一个mirror驱动的,封成了托管DLL,也一样好用。楼主也可以考虑一下。

指针类型
是不安全的代码,你需要标记组件允许不安全的代码,并在方法定义中的生活不安全的方法

初始化固定(字节*数据),这样定义的,以防止垃圾收集器认为定位高度可变的移动。

详细的参考的 http://msdn.microsoft.com / ZH-CN/library/vstudio/y31yhkeb 的(ν= vs.110)。 ASPX

用string。 char*表示返回一个字符类型的内存地址。此字符串在函数中应该不会有任何改变
stringbudiler是变动字符串常用的。

使用system::string就可以了,因为你已经指定了CharSet = CharSet.Ansi, CLR可以自动转换ascI字符串和unicode 字符串(.net字符串)

string []

StringBuilder


武隆县15257532268: c#调用c++写的dll 时,c++中有一函数返回值为char*.在c#中相应的数据类型应该用什么类型啊. -
公审肝复: 使用system::string就可以了,因为你已经指定了CharSet = CharSet.Ansi, CLR可以自动转换ascI字符串和unicode 字符串(.net字符串)

武隆县15257532268: C#中调用C++编译的DLL -
公审肝复: 如果是托管C++的话可以像1L说的一样直接引用,不过估计这样你就不会问了吧…… C#当中可以调用Native代码DLL中导出的函数,前提是你知道这个函数的名字.不要以为这个条件很简单,这意味着你必须把这个函数定义为extern "C"(也...

武隆县15257532268: C#如何调用C++编译的Dll? -
公审肝复: 调用非托管的DLL文件需要 通过调用Windows API封装:LoadLibrary/FreeLibrary [DllImport("kernel32",EntryPoint="LoadLibrary",SetLastError=true)]static extern IntPtr LoadLibrary(string lpLibName); [DllImport("kernel32",...

武隆县15257532268: C#调用C++ dll时,C++的string该怎么办 -
公审肝复: 以找另一台的电脑上去复制下这个缺失的文件,看看能否解决问题 或者你可以尝试使用腾讯电脑管家来修复缺失DLL文件 具体方法是,打开腾讯电脑管家--电脑诊所--软件问题--丢失.Dll 文件--一键修复--完成 如果还是解决不了,去脚本之家下一个文件直接复制进去就能搞定了 如果找不到,还可以下载一个dx修复工具3.0增强版,去修复一下

武隆县15257532268: C#调用C++生成的DLL文件会影响C++程序的执行效率吗? -
公审肝复: C#调用C++生成的DLL文件不会影响C++程序的执行效率. 细节如下:1. DLL执行的时候,已经是C++编译后的目标语言,和C#没有关系;2. C#调用的时候需要二者传递一下参数,传递完成后就是C++程序的效率在执行了.

武隆县15257532268: c#使用DllImport调用c++dll的函数 -
公审肝复: 调用格式如下:[DllImport("ex.dll", EntryPoint = "method")] public static extern void method(int a); 其中ex.dll为C++DLL名,method为函数名, 这里的int a为C++中方法的参数转换.例:C++DLL名:Interface.dll,函数为voidCopMemFree(...

武隆县15257532268: C#调用C++dll中的函数报错,参数为结构体数组 -
公审肝复: 如果像 在引用中直接引用的话,肯定会出现问题的 你只要把C++ 的DLL放到某个路径即可 在C#中 DllImport中能找到这个路径就可以 还有就是 C++中的整型数据在C#中如果表示 把上面的问题搞定肯定不会出现错误了!

武隆县15257532268: C#动态调用C++编写的DLL函数 -
公审肝复: 调用dll有很多方式,比如通过发送消息,比较简单直观就是直接调用.例如:有一个DllProgress.dll,将他放在应用程序同级目录下,HINSTANCE hIns=NULL; hIns=LoadLibrary("DllProgress.dll");//定义希望调用的函数 指针 typedef float (*pFunc)(int...

武隆县15257532268: C#调用C++的dll时报“尝试读取或写入受保护的内存.这通常指示其他内存已损坏.”的错. -
公审肝复: 不要 把内存地址跨模块使用, char *& 的使用是非法 的,推翻重写吧 你的借口设计很不合理.比如 你要申请pszOutData的内存空间 你应该在用到它的地方申请 然后将地址和大小传递给动态库.

武隆县15257532268: C#调用C++生成的dll函数问题 -
公审肝复: 我引用C++ 的Dll是这样引用的: [DllImport(@"CSModCG.dll")] public static extern int void(); 由于参数的不正确经常会出现你这样的错误,所以我估计你的错误出现是在 gdImagePng(im, pngout); ,但原因应该是在 pngout = fopen("d:\\1.png", "wb");,也就是说你的D盘是否有文件1.png 然后你这样写绝对位置然后再在C#里面引用是有问题的,你最好写相对位置

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网