导出托管的C#函数以将更改的char *参数返回到非托管代码

UяošKoт

我有一个本地C ++(我认为)应用程序,可以将其配置为加载某个dll并调用一个函数。此函数返回int,接受四个参数,应更改两个参数中的至少一个并返回一个值。根据手册,此功能应在C ++中定义为:

__declspec( dllexport ) int funcName(const char* par1, const char* par2, char* par3, char* par4);

但是,根据需要,此功能应在C#中实现。我正在使用“非托管导出”来允许我使用:

[DllExport("funcName", CallingConvention.Cdecl)]
public static unsafe int funcName(string par1, string par2, string par3, string par4) {
    // sample for par3 only when using StringBuilder instead of string
    // but is similar with other types
    par3 = new StringBuilder(256); 
    par3.Append("12345"); 
    return 0; 
}

参数1和2可以正常工作(我可以在消息框中输入接收到的值),但是我已经尝试(至少)将以下参数用作第3和第4参数:

char* =>
=> string
=> StringBuilder
=> char[]

所有这些与[In], [Out], [In,Out], out, ref

函数应更改par3和par4的值,并将整数返回给调用应用程序。应用程序读取par3的值(它实际上是一个表示为字符串的整数),并将其写到日志文件中。检查日志文件后,该值不是funcName(...)中设置的值。

最常见的值是“”(空),但是仅当char[]与with一起使用时out或者ref似乎有传回的值,但它只是一些奇怪的字符(不是在funcName中设置的值)。

因此问题是,从非托管代码调用托管dll函数时如何返回char *参数?

戴维·赫弗南

我非常怀疑这UnmanagedImports会对您有所帮助。StringBuilder除非我非常误解,否则它就不会存在。我认为您需要这样编码:

[DllExport("funcName", CallingConvention.Cdecl)]
public static int funcName(string par1, string par2, IntPtr par3, IntPtr par4) 
{
    string inputStr = Marshal.PtrToStringAnsi(par3);
    string outputStr = "foo\0";
    byte[] outputBytes = Encoding.Default.GetBytes(outputStr);
    Marshal.Copy(outputBytes, 0, par3, outputBytes.Length);
    return 0; 
}

请注意,我删除了,unsafe因为不需要。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用非托管导出将字符串从 C# 返回到 C++ 返回数字

来自分类Dev

托管代码与非托管代码

来自分类Dev

将 C++ 非托管代码转换为 C#

来自分类Dev

C#-从非托管代码返回类型int *

来自分类Dev

从C#调用非托管代码

来自分类Dev

将托管功能导出到非托管

来自分类Dev

混合托管和非托管代码问题

来自分类Dev

如何通过 out 参数将变量从 iOS 本机代码返回到 C#?

来自分类Dev

无法使用C#和Robert Giesecke的非托管导出工具创建非托管dll

来自分类Dev

将回调参数从C#传递到非托管C ++

来自分类Dev

将回调参数从C#传递到非托管C ++

来自分类Dev

从 c# 调用非托管代码。使用 IntPtr 获取数据

来自分类Dev

非托管C ++代码上的NullReferenceException

来自分类Dev

从非托管C ++代码访问WPF

来自分类Dev

使用C#在非托管代码中将委托传递给回调函数

来自分类Dev

非托管C#与C ++

来自分类Dev

是否可以通过[DllImport]属性将Java“非托管”代码导入C#?

来自分类Dev

从非托管代码传播到托管代码的异常?

来自分类Dev

将托管引用(this)传递给非托管代码并调用托管回调

来自分类Dev

整理结构数组以从C#调用非托管函数

来自分类Dev

将结构从非托管C ++传递到C#

来自分类Dev

托管和非托管代码之间的传递结构

来自分类Dev

如何将类从C ++代码返回到C#

来自分类Dev

无法将字符串从托管C#传递到非托管C

来自分类Dev

无法将字符串从托管C#传递到非托管C

来自分类Dev

用指针调用非托管代码

来自分类Dev

清理非托管代码中的内存泄漏

来自分类Dev

IL中的“非托管”通用参数约束

来自分类Dev

从C#DLL中使用非托管导出返回字符串到Inno Setup脚本

Related 相关文章

热门标签

归档