【问题标题】:Marshaling c++ strncpy function from dll into c#将 c++ strncpy 函数从 dll 编组到 c#
【发布时间】: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# 端的列表

标签: c# string dll char


【解决方案1】:
using System.Text;
using System.Runtime.InteropServices;

namespace MySpace
{       
    class MyDll {
        [DllImport("MyStrCopy.dll", CharSet = CharSet.Ansi)]
        public static extern void MyStrCopy(
             StringBuilder  dst_str, 
             string         src_str, 
             int            dst_len);       

        static void ExampleUsage() {
            int           dest_len   = 100;
            StringBuilder dest_str   = new StringBuilder(dest_len);
            string        source     = "this is a string";
            MyStrCopy(dest_str, source, dest_len);
            return;
        }       

    } //class
} //namespace

【讨论】:

    猜你喜欢
    • 2012-12-01
    • 2010-10-08
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    相关资源
    最近更新 更多