将字符串从C#传递到C .dll - 获取额外的字符

时间:2015-08-28 14:43:46

标签: c# c dll

我正在使用一个将使用.dll的C#项目(用C语言编写)当将一个char数组传递给.dll函数runInterpretation时,我将额外的字符添加到我的字符串中。

C#代码:

[DllImport(@"c:\projectName\main.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "runInterpretation")]

public static extern int runInterpretation(char[] inputStr);

static void Main(string[] args)
{
    string inputString = "DR1234,2014/07/27 15:20:10,1,0,3,0,0,2,5,30,10,10,0,55,205,21500,86400,110,0,";

    int tmp = runInterpretation(inputString.ToCharArray());

}

调用C .dll:

#include <stdio.h>                                                                      
#include <time.h>                                                                       
#include <string.h>                                                                     

#include "fixedtext.h"                                                              
#include "englarrini.h"
#include "numarrini.h"                                                              
#include "argcvalue.c"                                                              
#include "dgavalid.c"                                                                   
#include "ratio.c"                                                                      
#include "interp.c"                                                                     
#include "validdisplay.c"                                                           

#ifdef DEVX
#define DATAFILEPATH "/home/drmcc/log/"                             
#elif DEVY
#define DATAFILEPATH "/home/drmcc/log/"                             
#elif PC
#define DATAFILEPATH ".\\data\\"                                            
#else
#define DATAFILEPATH ".\\data\\"                                            
#endif

__declspec(dllexport) int runInterpretation(char *inputString[])
{
    printf("args %s\n", inputString);

    return 1;
}

运行我的C#项目时的最终结果如下(最后一个&#39;之后的随机额外字符,&#39;)

enter image description here

我想知道为什么要添加额外的字符以及如何摆脱它们。

谢谢

2 个答案:

答案 0 :(得分:4)

我不认为你想要你的C dll论点。如果您只想传入一个字符串,那么它应该是:

__declspec(dllexport) int runInterpretation(char *inputString)

或更好:

__ declspec(dllexport)int runInterpretation(wchar_t * inputString)

从那里,你只需要告诉C#如何编组你的字符串。最简单的方法是使用MarshalAsAttribute。如果您使用char *解释,请使用

public static extern int runInterpretation(
[MarshalAs(UnmanagedType.LPStr)]
String inputStr);

或Unicode版本:

public static extern int runInterpretation(
[MarshalAs(UnmanagedType.LPWStr)]
String inputStr);

还值得注意的是,如果将C参数更改为Unicode,则不必在C#中使用编组提示,因为它默认会正确编组。

答案 1 :(得分:1)

在C中,字符串应该以null结尾。 &#34;额外的角色&#34;是在数组之后发生在内存中的任何内容,直到找到空字符。 ToCharArray()不会附加空字符,因为在C#的上下文中这不会有意义。我可以想出两种方法来解决这个问题:

  • 假设您可以更改C DLL的API,请添加第二个长度参数,并使用它来确保您不会超过数组的末尾
  • 在调用ToCharArray()之前,在字符串中附加一个空字符。有关示例,请参阅https://stackoverflow.com/a/2794356/3857