我正在使用一个将使用.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;)
我想知道为什么要添加额外的字符以及如何摆脱它们。
谢谢
答案 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#的上下文中这不会有意义。我可以想出两种方法来解决这个问题:
ToCharArray()
之前,在字符串中附加一个空字符。有关示例,请参阅https://stackoverflow.com/a/2794356/3857