【发布时间】:2018-02-24 19:24:25
【问题描述】:
下面是一个玩具示例,可以更好地理解 c# 和 c++/dll 之间的字符串类型的编组。
将下面的“MyStrCopy”函数编组到 c# 中的最佳方法是什么? (最好不使用 unsafe 关键字,并将类型作为字符串类型传入和传出 c#。)
文件:MyStrCopy.cs
using System.Runtime.InteropServices;
namespace MySpace {
class MyDll {
[DllImport (@"MyStrCopy")]
public static extern void MyStrCopy(
string dest????, string source????, int dest_length????);
}
}
文件:MyStrCopy.h:
extern "C" {
void __declspec(dllexport) MyStrCopy(
char* dest, const char* source, int dest_length);
}
文件:MyStrCopy.cpp
#include <cstring>
#include "MyStrCopy.h"
void MyStrCopy(char* dest, const char* source, int dest_len) {
strncpy(dest, source, dest_len);
dest[dest_len-1] = 0; // zero terminated when source > dest
}
我将上面的文件“MyStrCopy.cpp”编译成一个名为:MyStrCopy.dll的dll
我也有点好奇,如果你在不使用不安全和封送类型到字符串的相同偏好下返回 char* 会是什么样子。例如,如果 dll 导出的函数看起来像这样:
char* MyStrCopy(char* dest, const char* source, int dest_len) {
return strncpy(dest, source, dest_len);
}
【问题讨论】:
-
使用被设计破坏的 C 函数是非常不明智的,strncpy() 存在致命缺陷,因为它不能保证它会以零结尾的字符串。这将使 C# 程序因无法诊断的 AccessViolationException 而崩溃。这个玩具将是另一个程序员的大头疼,投票关闭。
-
这很好,在 strncpy() 之后添加以下内容,它适用于所有情况:dest[dest_len-1] = 0;无论如何,重点只是看一下 C# 中的 [DllImport] 语法示例,它允许您将字符串传递给 strncpy() 之类的函数,无论它们可能是什么......在我的例子中,我真的试图从中弹出一些值使用 DLL 互操作从 c++ 端到 c# 端的列表
。