Net Core教程

C#调用C++编写的DLL整型和字符串传参

本文主要是介绍C#调用C++编写的DLL整型和字符串传参,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

C#调用C++编写的DLL整型和字符串传参

直接返回值

目录

  • C#调用C++编写的DLL整型和字符串传参
    • 直接返回值
      • DLL返回字符串
      • DLL返回整型
    • 参数传参

DLL返回字符串

C++ Code:

extern "C" __declspec(dllexport) char* GetStr()

{
        string s = "This is a string";
       return _strdup(s.c_str());   //一定要用_strdup()复制一段内存,不然等调用结束字符串内存会被释放得到一串乱码

}

C# Code:

public class CppDll
{
        [DllImport(DllPath, CallingConvention = CallingConvention.Cdecl)]
        public extern static IntPtr GetStr();
        
        public static GetStrFun()
        {
                IntPtr p = GetStr();    //调用DLL函数
                string s = Marshal.PtrToStringAnsi(p);   //根据实际情况决定使用PtrToStringUni还是PtrToStringAnsi
        }

}

DLL返回整型

C++ Code:

extern "C" __declspec(dllexport) int GetInt()

{
       return 1;
}

C# Code:

public class CppDll
{
        [DllImport(DllPath, CallingConvention = CallingConvention.Cdecl)]
        public extern static int GetInt();
}

int res = CppDll.GetInt();  //调用

参数传参

除了可以在返回值里带出字符串,也可以在函数参数中带出,类似与C语言中需要获取多个值的情形,这里展示一下DLL中同时传递字符串和整型量。由于C#为托管内存,C++运行在非托管内存,所以需要在C#中手动申请一块内存用来存储C++中返回的值。

C# Code:

public CppDll
{
        [DllImport(DllPath, CallingConvention = CallingConvention.Cdecl)]
        public extern static int GetCapInfo(int index, IntPtr proName, IntPtr cnt);
}

IntPtr PproName = Marshal.AllocHGlobal(256);    //手动申请存储字符串类型
IntPtr Pcnt = Marshal.AllocHGlobal(sizeof(int));    //存储整数类型

int status = CppDll.GetCapInfo(0, PproName, Pcnt);

string proName = Marshal.PtrToStringAnsi(PproName);
int cnt = Marshal.ReadInt32(Pcnt);

Marshal.FreeHGobal(PproName);   //手动申请的内存手动释放
Marshal.FreeHGobal(Pcnt);


C++ Code:

extern "C" __declspec(dllexport) int GetCapInfo(int index, char* proName, int* cnt) //后两个参数为需要传递的值
{
       if (index >= capHlp.pro_to_cnt.size())
       {
              return -1;
       }
       string key = capHlp.proIndex[index];
       *cnt = capHlp.pro_to_cnt[key];           // 把需要传递的整数复制到指定内存
       sprintf_s(proName, 256, key.c_str());    //把需要传递的字符串复制到指定内存
       return 0;
}
这篇关于C#调用C++编写的DLL整型和字符串传参的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!