首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C#调用C函数返回具有固定大小char数组的struct

在C#中,可以使用P/Invoke(Platform Invocation Services)来调用C语言中的函数。P/Invoke是一种跨平台的技术,可以让C#代码调用C语言中的函数。以下是一个示例,展示了如何在C#中调用C语言中的函数,该函数返回一个具有固定大小的char数组的struct。

首先,我们需要在C语言中定义一个函数,该函数返回一个具有固定大小的char数组的struct:

代码语言:c
复制
#include <stdlib.h>
#include<string.h>

typedef struct {
    char data[10];
} DataStruct;

__declspec(dllexport) DataStruct* GetData() {
    DataStruct* result = (DataStruct*)malloc(sizeof(DataStruct));
    strcpy(result->data, "Hello, C#!");
    return result;
}

接下来,我们需要在C#中使用P/Invoke来调用这个函数:

代码语言:csharp
复制
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct DataStruct
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
    public string data;
}

public class Program
{
    [DllImport("YourLibraryName.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern IntPtr GetData();

    public static void Main(string[] args)
    {
        IntPtr ptr = GetData();
        DataStruct data = (DataStruct)Marshal.PtrToStructure(ptr, typeof(DataStruct));
        Console.WriteLine(data.data);
    }
}

在上面的代码中,我们首先定义了一个名为DataStruct的struct,并使用了StructLayout属性来指定其布局。我们还定义了一个名为GetData的函数,该函数返回一个指向DataStruct的指针。

在C#代码中,我们使用DllImport属性来指定要调用的C语言函数。我们还使用Marshal类来将指针转换为DataStruct对象。最后,我们打印出结果。

请注意,我们在上面的代码中使用了YourLibraryName.dll作为示例。您需要将其替换为您实际编译的库的名称。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券