为什么将字符串从C#传递到C ++ dll会得到NULL?

徐曼

我正在尝试将C#可执行文件连接到C ++ dll。dll的方法之一接收const char *和int *(第一个方法指定输入值,第二个方法指定返回值的地址):

extern "C" __declspec(dllexport)
  int setVal(long handle, const char* ptrVal, int* ptrRet);

此函数要做的第一件事是检查ptrVal是否为null,如果是,则返回-1。

另一方面,C#代码按如下方式调用dll:

[DllImport(dllName,
           EntryPoint = "setVal",
           ExactSpelling = true,
           CallingConvention = CallingConvention.Cdecl,
           CharSet = CharSet.Ansi)]
public static extern int setVal(long handle,
                                [MarshalAs(UnmanagedType.LPStr)] string str,
                                ref int ptrRes);

在主要功能中,我有

long handle = 0;
int result = 0;
int res = 0;
string str = "Hello World!";
result = setVal(handle, str, ref res);

调用此函数时,我总是在C端收到一个空指针,这使结果等于-1。声明包装函数时,我尝试了不同的方法,但没有成功:

public static extern int setVal(long handle, 
                                [MarshalAs(UnmanagedType.LPStr)] [In] string str,
                                [Out] int ptrRes);
public static unsafe extern int setVal(long handle,
                                       [MarshalAs(UnmanagedType.LPStr)] string str,
                                       ref int ptrRes);
public static extern int setVal(long handle, 
                                StringBuilder sb,
                                ref int ptrRes); // also the unsafe version
public static extern int setVal(long handle,
                                byte[] value,
                                ref int ptrRes); // also the unsafe version

我正在使用Visual Studio 2017和.NET Framework 4.6.1。

为什么我总是收到NULL作为dll函数的第二个参数(const char *)?

还有斯科特

我做了一点谷歌,所以这将是未经测试的代码,但我可以看到这是您没有尝试过的东西

像这样声明外部

[DllImport(dllName, EntryPoint = "setVal", ExactSpelling = true, CallingConvention, CallingConvention.Cdecl,CharSet = CharSet.Ansi)]
public static extern int setVal(int handle, StringBuilder sb, ref int ptrRes);

像这样使用

int handle = 0;
int result = 0;
int res = 0;
StringBuilder sb = new StringBuilder("Hello World");
result = setVal(handle, sb, ref res);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将字符串从DLL传递到C#

将字符串从Fortran dll传递到C#

为什么将String与null比较时会得到NullPointerException?

将var字符串从C ++传递到Delphi dll

为什么将JSON发布到Web API方法时会得到null?

为什么我会得到“隐含的评估”。将简单字符串传递给状态时考虑传递函数而不是字符串'?

从C#到C-DLL调用/封送该结构时,为什么此字符串为空?

为什么在web api C#的post方法中将字符串变量的值传递为null

从C#字符串将char *传递给C DLL

尝试将text / xml转换为对象时,为什么会得到{“ location”:null}?

我需要了解为什么在将值添加到标签时会得到null?

为什么 C# 编组字符串不适用于 C++ DLL

C ++ DLL LPCTSTR到C#字符串

当我没有取消引用任何指向Null的东西时,为什么会得到NullPointerException?

为什么在使用 ResultSet 时会得到一个额外的结果为 null?

在Flutter wih Firestore中使用foreach方法后,为什么会得到null?

为什么在尝试显示特定学生的详细信息时会得到“null”?

为什么会得到:无法将null强制转换为非null类型的android.widget.SearchView?

将字符串从Delphi传递到C#将返回null。但是,当我从Delphi调用Delphi库时,它工作正常。如何从Delphi接收字符串

为什么在python中使用re.split()时会得到那些空字符串?

为什么我会得到“不会将false隐式转换为字符串”

为什么从字符串创建 JSONObject 时会得到一个空对象?

名称为null时,Sigar的getNetInterfaceConfig(String name)方法会得到什么?

为什么我在 C# 和 C++ 中得到一个整数而不是字符串?

当我尝试添加拆分后的字符串时,为什么会得到空字符串?

当我处理字符串时,为什么会得到“预期的字符串或缓冲区”?

为什么我偶尔会得到不同的结果?【C语言】

为什么Spring MVC会得到404?

为什么会得到以下结果?