如何通过p / invoke传递字符串?

时间:2013-08-05 12:22:25

标签: c# pinvoke

我需要通过p / invoke传递一个字符串,它只是一个文件名,类似于“desc.xml”。 我不在乎它是std::string还是char*还是其他东西(我可以转换为合适的类型)。我该如何申报签名?

在c#方面,我希望有类似的东西:

    [DllImport("Native.dll"), SuppressUnmanagedCodeSecurity]
    public static extern void Initialize(/*TODO: how to pass string?*/);

在c ++方面,我期待类似的东西:

__declspec(dllexport) void Initialize(char* fileName);

std::string代替char*

__declspec(dllexport) void Initialize(std::string& fileName);

我希望它能像这样使用:

Initialize("desc.xml");

问题是我应该如何申报参数。

3 个答案:

答案 0 :(得分:3)

public static extern void Initialize(string filename);

同时在DllImport("Native.dll")添加CharSet以匹配您在C ++方面的内容({1}} CharSet.Ansichar* CharSet.Unicode })。

答案 1 :(得分:2)

假设您想要接收ANSI编码文本,您应该声明C ++代码:

__declspec(dllexport) void Initialize(const char* fileName);

这将使用__cdecl的默认调用约定。该文本将作为指向char

的以null结尾的数组的指针传递

在C#方面你声明它是这样的:

[DllImport("Native.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern void Initialize(string fileName);

由于默认值为ANSI,因此无需指定字符集。如果你想要明确(在我的观点中不是一个坏主意)那么你可以这样写:

[DllImport("Native.dll", CallingConvention=CallingConvention.Cdecl, 
    CharSet=CharSet.Ansi)]
public static extern void Initialize(string fileName);

如果您编译C ++代码,函数的名称将被修改。您必须使用EntryPoint属性的DllImport参数来指定受损名称。作为替代方案,您可以在extern "C"块中包含本机代码的函数声明,以抑制重整。

答案 2 :(得分:0)

希望this link将帮助您获取非托管代码的参数