ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C# 调用 C/C++ 非托管程序

2021-09-26 18:34:43  阅读:173  来源: 互联网

标签:调用 extern C# void CharSet C++ int static cppFun


尝试用 C# 和 C/C++ 混合编程玩下,主要看看如何传参。

传基本的数据类型

intdouble这类的基本类型直接传参好像问题不大。

C++:

extern "C" __declspec(dllexport)  double cppFun(int a, double b)
{
    return a + b;
}

C#:

class CppFunction
{
    [DllImport(@"E:\CPP\lian_xi\CS\61_CsCpp混合编程\Cpp代码\CppCode\Debug\CppCode.dll",
        CharSet = CharSet.Unicode,
        CallingConvention = CallingConvention.Cdecl)]
    public extern static double cppFun(int a, double b);//好像必须要静态 static
}
class Program
{
    static void Main(string[] args)
    {
        double result = CppFunction.cppFun(10, 0.15);
        Console.WriteLine(result);

        Console.ReadKey();
    }
}

输出:

10.15  // 输出基本问题

传带指针的数据类型

▲ 先打开不安全代码权限

交换两个数值

C++:

extern "C" __declspec(dllexport)  void  cppFun(int *p1, int  *p2)
{
    int temp;
    temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

C#:

class CppFunction
{
    [DllImport(@"E:\CPP\lian_xi\CS\61_CsCpp混合编程\Cpp代码\CppCode\Debug\CppCode.dll",
        CharSet = CharSet.Unicode,
        CallingConvention = CallingConvention.Cdecl)]
    public unsafe static extern void cppFun(int* a, int* b);//好像必须要静态 static
}
class Program
{
    static void Main(string[] args)
    {
        int a = 10, b = 20;

        unsafe { CppFunction.cppFun(&a, &b); }

        Console.WriteLine("{0} {1}", a, b);

        Console.ReadKey();
    }
}

输出:

20 10  //可见交换是成功的

可以在不打开不安全代码是用 ref 参数来实现:

public static extern void cppFun(ref int a, ref int b);
CppFunction.cppFun(ref a, ref b);

这样也是能够实现。

传递字符串参数

传个char *试一下:

C++:

extern "C" __declspec(dllexport)  void  cppFun(const char *s)
{
    cout << s << endl;
}

C#:

 class CppFunction
    {   // CharSet = CharSet.Ansi  字符编码要用 ASCII
        [DllImport(@"E:\CPP\lian_xi\CS\61_CsCpp混合编程\Cpp代码\CppCode\Debug\CppCode.dll",
            CharSet = CharSet.Ansi,
            CallingConvention = CallingConvention.Cdecl)]
        public static extern void cppFun(string s);//好像必须要静态 static
    }
    class Program
    {
        static void Main(string[] args)
        {
            string s = "哎哟,不错哦!";
            CppFunction.cppFun(s);

            Console.ReadKey();
        }
    }

注意字符编码CharSet = CharSet.Ansi,要用 ANSI 修饰

输出:

哎哟,不错哦!  // 输出正确

各种数据类型是如何对应的:

▲ MSDN上对应的数据类型表

MSDN 数据类型对应。

标签:调用,extern,C#,void,CharSet,C++,int,static,cppFun
来源: https://www.cnblogs.com/huvjie/p/15339488.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有