user-0 提问: C程序打包为DLL在C#调用出错（含完整源代码）

回复:
user: user-1
content: 引用 7 楼 weiran2009 的回复:[quote=引用 5 楼 CharlesSimonyi 的回复:] DllExport void cvCanny(string str)  这里也有问题，c++中的string和c#中的string是不一样的，应该使用const char *或const wchar_t * DLL导出函数尽量以简单C类型为参数  您好，我按照网上这个帖子的方法： http://blog.csdn.net/shilogic/article/details/7027360   //头文件： #define DllExport __declspec(dllexport)  namespace OpenCV2UnityStudy0715 { 	//Return a + b 	extern "C" DllExport int plgAdd(int x, int y);  	//Return a * b 	extern "C" DllExport int plgMultiply(int x, int y);  	//	extern "C" DllExport const char *__stdcall  cvCanny(char *s); 	extern "C" DllExport void cvCanny(char *str); 	extern "C" DllExport const char* __stdcall ProcessString(char* str); 	//test string  	//extern "C" DllExport string plgString(); }   //cpp文件： namespace OpenCV2UnityStudy0715 { …… 	const char* __stdcall ProcessString(char* str) 	{  		//str 是 c# 创建的 StringBuilder，长度是255 		strcpy_s(str,sizeof(str), "I come from C++ PS class!!!"); 		//strcpy_s() 		return str; 	} …… }    C#代码：   using UnityEngine; using System.Collections; using OpenCvSharp.CPlusPlus; using OpenCvSharp; using System.Runtime.InteropServices;  using System;//IntPtr ... using System.Text;//StringBuilder str  public class testOpenCV0714 : MonoBehaviour {     [DllImport("OpenCV2UnityDLLTest0714")]     private static extern int plgCGetRandom();   //    [DllImport("OpenCV2UnityDLLw0715c", EntryPoint = "cvCanny", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Winapi)] //    public static extern IntPtr cvCanny(StringBuilder str); //    [DllImport("OpenCV2UnityDLLw0718", EntryPoint = "cvCanny", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Winapi)] //    private static extern void cvCanny(StringBuilder str);     [DllImport("OpenCV2UnityDLLw0718")]     private static extern void cvCanny(string str);     [DllImport("OpenCV2UnityDLLw0715c")]     private static extern int plgAdd(int a, int b);     [DllImport("OpenCV2UnityDLLw0715c")]     private static extern int plgMultiply(int a, int b);     [DllImport("VC.dll", EntryPoint = "ProcessString", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Winapi)]     public static extern void ProcessString(StringBuilder str);  	void Start () {          StringBuilder sSetPath = new StringBuilder(255);         StringBuilder str = new StringBuilder(255); //255 是 capacity         ProcessString(str);         print(str.ToString()); }   其它方法都能运行（简单加减乘除），但只要运行到 ProcessString(str);函数有关还是上面的问题，请问这是如何解决呢？[/quote]   不懂，但是可以推测是字符串参数没有正确传递

user: user-2
content: 检查调用约定

user: user-0
content: 引用 5 楼 CharlesSimonyi 的回复:DllExport void cvCanny(string str)  这里也有问题，c++中的string和c#中的string是不一样的，应该使用const char *或const wchar_t * DLL导出函数尽量以简单C类型为参数  您好，我按照网上这个帖子的方法： http://blog.csdn.net/shilogic/article/details/7027360   //头文件： #define DllExport __declspec(dllexport)  namespace OpenCV2UnityStudy0715 { 	//Return a + b 	extern "C" DllExport int plgAdd(int x, int y);  	//Return a * b 	extern "C" DllExport int plgMultiply(int x, int y);  	//	extern "C" DllExport const char *__stdcall  cvCanny(char *s); 	extern "C" DllExport void cvCanny(char *str); 	extern "C" DllExport const char* __stdcall ProcessString(char* str); 	//test string  	//extern "C" DllExport string plgString(); }   //cpp文件： namespace OpenCV2UnityStudy0715 { …… 	const char* __stdcall ProcessString(char* str) 	{  		//str 是 c# 创建的 StringBuilder，长度是255 		strcpy_s(str,sizeof(str), "I come from C++ PS class!!!"); 		//strcpy_s() 		return str; 	} …… }    C#代码：   using UnityEngine; using System.Collections; using OpenCvSharp.CPlusPlus; using OpenCvSharp; using System.Runtime.InteropServices;  using System;//IntPtr ... using System.Text;//StringBuilder str  public class testOpenCV0714 : MonoBehaviour {     [DllImport("OpenCV2UnityDLLTest0714")]     private static extern int plgCGetRandom();   //    [DllImport("OpenCV2UnityDLLw0715c", EntryPoint = "cvCanny", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Winapi)] //    public static extern IntPtr cvCanny(StringBuilder str); //    [DllImport("OpenCV2UnityDLLw0718", EntryPoint = "cvCanny", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Winapi)] //    private static extern void cvCanny(StringBuilder str);     [DllImport("OpenCV2UnityDLLw0718")]     private static extern void cvCanny(string str);     [DllImport("OpenCV2UnityDLLw0715c")]     private static extern int plgAdd(int a, int b);     [DllImport("OpenCV2UnityDLLw0715c")]     private static extern int plgMultiply(int a, int b);     [DllImport("VC.dll", EntryPoint = "ProcessString", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Winapi)]     public static extern void ProcessString(StringBuilder str);  	void Start () {          StringBuilder sSetPath = new StringBuilder(255);         StringBuilder str = new StringBuilder(255); //255 是 capacity         ProcessString(str);         print(str.ToString()); }   其它方法都能运行（简单加减乘除），但只要运行到 ProcessString(str);函数有关还是上面的问题，请问这是如何解决呢？

user: user-1
content: 引用 5 楼 CharlesSimonyi 的回复:DllExport void cvCanny(string str)  这里也有问题，c++中的string和c#中的string是不一样的，应该使用const char *或const wchar_t * DLL导出函数尽量以简单C类型为参数  以本人猜测，这个可能较大。也就是文件名没有正确传递过去

user: user-3
content: DllExport void cvCanny(string str)  这里也有问题，c++中的string和c#中的string是不一样的，应该使用const char *或const wchar_t * DLL导出函数尽量以简单C类型为参数

user: user-0
content: 引用 2 楼 liups 的回复:用Emgu CV吧 嘿！终于看到一位搞OpenCV的小伙伴了~ 不过据我所知，现在主要有2种方案解决：  1、使用OpenCvSharp 2、使用OpenCVForUnity  2好像收费，主要是 Texture2D与Mat 的转换问题， 我现在就想，直接从OpenCV里面生成dll在Unity里面调用，不过看起来比较复杂，更谈不上在Android里面Unity调用了……

user: user-0
content: 引用 1 楼 user-4 的回复:c的动态库只需要头文件和dll文件，不需要源文件。 头文件中，不要出现c++的数据类型，只能使用c的数据类型  建议楼主仔细学习一下如何生成一个c语言兼容的dll   我这个代码好像就是C的，我要重新在C++板块发一个？ 感觉比较复杂，请问有专门的书籍介绍如何跨平台dll打包的吗？

user: user-1
content: 用Emgu CV吧

user: user-4
content: c的动态库只需要头文件和dll文件，不需要源文件。 头文件中，不要出现c++的数据类型，只能使用c的数据类型  建议楼主仔细学习一下如何生成一个c语言兼容的dll