将缓冲区地址从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" );
}
我意识到我使用了'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);
}