将缓冲区地址从c#传递到C

本文关键字:缓冲区 地址 | 更新日期: 2023-09-27 18:19:23

我有麻烦弄清楚如何通过一个缓冲区地址从c#到C.我检查了几个参考。一个似乎解释如何(传递指针引用内存分配在托管代码到非托管),但当我模仿它,我不能让它工作。

输出应该是"This is data",但是输出却是"buffer=System.Char[]"。

如果我使用调试器,我可以看到字符串"这是数据"实际上被正确复制,但C函数中的"缓冲区"的地址与c#代码中的"缓冲区"的地址不同。所以我认为上面引用的链接是假设没有解释的c#的其他知识。或者我只是不明白附加的答案。

下面是我的代码:
XBaseNamespace.cs
-----------------
//  XBase functions
using System;
using System.Runtime.InteropServices;
namespace XBaseNamespace.SecondNamespace
{
    class XBaseFunctions
    {
        [DllImport("W:''C_sharp''Call_C''Debug''C_dll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern void ProcessBigBuffer([MarshalAs(UnmanagedType.LPArray)] char[] buffer);
    }
}
Program.cs
----------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using XBaseNamespace.SecondNamespace;

namespace Call_C
{
    class Program
    {
        static void Main()
        {
            char[] buffer = new char[1000];
            // initialize the buffer
            // and then process it
            XBaseFunctions.ProcessBigBuffer(buffer);
            Console.WriteLine("buffer={0}'n", buffer);
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}
c_dll.c
-------
//  C DLL experiment
#include <stdio.h>
#include <string.h>
#define DSI_DLL __declspec(dllexport) 
#define CALL_TYPE //__stdcall
DSI_DLL void CALL_TYPE ProcessBigBuffer( char* buffer )
{
    strcpy( buffer, "This is data" );
}

将缓冲区地址从c#传递到C

我意识到我使用了'char',因为我太习惯c了。我应该使用'byte'。现在缓冲区显示如我所期望的那样。我是这样做的:

XBaseNamespace.cs
-----------------
[DllImport("W:''Dropbox''DSI (His)''Windows Apps''Debug''DsiLibrary_CSharp.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int XBaseRead(UIntPtr pDefineFile, [MarshalAs(UnmanagedType.LPArray)] byte[] buffer, long bytes, bool reverse, O_FLAG oflag);
Program.c
---------
byte[] buffer = new byte[160];
XBaseFunctions.XBaseRead(df2500VENDR, buffer, 160, false, XBaseFunctions.O_FLAG._O_BINARY);
foreach (byte i in buffer)
{
    Console.Write("{0:X2} ", i);
}