Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C DLL函数得到了char*参数,我想在C#项目中导入_C#_Pinvoke_Dllimport - Fatal编程技术网

C DLL函数得到了char*参数,我想在C#项目中导入

C DLL函数得到了char*参数,我想在C#项目中导入,c#,pinvoke,dllimport,C#,Pinvoke,Dllimport,我有一个用C编写的DLL,我想导出函数: \u declspec(dllexport)int GetDllVersion(char*版本) 我有 class DllSolderMask { [DllImport("Dll.dll", CharSet=CharSet.Ansi)] public static extern int GetDllVersion(ref string version); } static void Main(string[] args) {

我有一个用C编写的DLL,我想导出函数:

\u declspec(dllexport)int GetDllVersion(char*版本)

我有

class DllSolderMask
{
     [DllImport("Dll.dll", CharSet=CharSet.Ansi)]
     public static extern int GetDllVersion(ref string version);
}

static void Main(string[] args)
{
        string strVersion;

        DllSolderMask.AltixDllVersion(ref strVersion);

        Console.WriteLine(strVersion.ToString());
}

char*Version显然是一个字符数组,因此ref string strrvision可以完成这项工作,但它不起作用

您是否尝试像这样传递字节[]:

    byte[] strVersion = new byte[256];

    DllSolderMask.AltixDllVersion(strVersion);

    string myString = System.Text.Encoding.Default.GetString(strVersion);
    Console.WriteLine(myString);

我认为从C++的观点来看,char只是一个8位条目数组的指针。< /P> < P> OK,我发现如何正确使用StrugBuud::/P>

[DllImport("AltixDll.dll", CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
public extern static int AltixDllVersion([MarshalAs(UnmanagedType.LPStr)] StringBuilder DllVersion);

StringBuilder str = new StringBuilder();
DllSolderMask.AltixDllVersion(str);
lblDll.Text = str.ToString();

字节数组方式不是动态的,它需要我知道数组声明中需要的空间,而且不准确。

尝试使用
[MarshalAs(UnmanagedType.LPStr)]字符串版本而不是
ref string version
。我不认为有必要
ref
是的,我已经尝试过[MarshalAs(UnmanagedType.LPStr)]该名称似乎暗示它将填充
版本
,但由于没有用于传递输出缓冲区长度的参数,因此API将成为一场等待发生的灾难。如果这样做,则传递您已初始化为所需容量的
StringBuilder
。(并将参数标记为
[Out]
)是的,
StringBuilder
肯定会工作。好吧,奇怪的是,它可以工作,但我之前尝试过,可能没有在字节数组中放入足够的大小,谢谢