我需要通过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");
问题是我应该如何申报参数。
答案 0 :(得分:3)
public static extern void Initialize(string filename);
同时在DllImport("Native.dll")
添加CharSet以匹配您在C ++方面的内容({1}} CharSet.Ansi
,char*
CharSet.Unicode
})。
答案 1 :(得分:2)
假设您想要接收ANSI编码文本,您应该声明C ++代码:
__declspec(dllexport) void Initialize(const char* fileName);
这将使用__cdecl
的默认调用约定。该文本将作为指向char
。
在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将帮助您获取非托管代码的参数