C# 如何在C中通过引用传递字节数组(到DLL中的C代码)
我很难弄清楚如何传递字节的I/O数组 从C到DLL中的C例程。我所说的I/O是指 C代码要在数组中设置数据,调用C例程, 并在返回时查看数组中已修改的数据。 在WinXP上使用VisualStudio2008 各种消息来源告诉我,C中的数组总是 通过引用传递。。。所以我希望char[]buf会 解决方案。似乎不是。。。看起来C是 在我背后做鬼鬼祟祟的事情,例如传递数据副本 我已经搜索过了,但是还没有找到一个对C程序员有用的C语言 讨论从C到C的参数传递: 如果我能确定如何在C中获取下面“stemp”的地址, 我可以在调用C代码之前和之后显示它。。。 并在C代码中显示传入地址 以下是主要的C代码:C# 如何在C中通过引用传递字节数组(到DLL中的C代码),c#,c,arrays,parameter-passing,C#,C,Arrays,Parameter Passing,我很难弄清楚如何传递字节的I/O数组 从C到DLL中的C例程。我所说的I/O是指 C代码要在数组中设置数据,调用C例程, 并在返回时查看数组中已修改的数据。 在WinXP上使用VisualStudio2008 各种消息来源告诉我,C中的数组总是 通过引用传递。。。所以我希望char[]buf会 解决方案。似乎不是。。。看起来C是 在我背后做鬼鬼祟祟的事情,例如传递数据副本 我已经搜索过了,但是还没有找到一个对C程序员有用的C语言 讨论从C到C的参数传递: 如果我能确定如何在C中获取下面“stem
[DllImport("c:/home/sieler/source/upshift.dll")]
internal static extern void ss_upshift1 (char [] buf, Int32 bytes);
static void Main(string[] args)
{
char [] stemp = new char [132];
string s;
s = "Testing\n\0";
stemp = s.ToCharArray ();
Console.WriteLine (stemp); // I see "Testing" on console window
ss_upshift1 (stemp, 7); // Inside the C routine, I see "Testing\n" and
// I change it to "TESTING\n"
Console.WriteLine (stemp); // I see "Testing", which is WRONG!
当我从ss_升档1回来时,“stemp”仍然保持不变
数据,即使我知道数据已修改…我可以打印“stemp”
在启动前和启动后,从C SSU升档1例行程序内部
升档
如果我将'buf'参数设置为'out',那么我会看到一个空值缓冲区
在C代码中,好像C在说我将为您分配一个新的缓冲区
“stemp”的副本,并将缓冲区归零,并传递其地址,
如果我将数据放入C中的缓冲区,当我
从ss_升档1回来。如果我不在C中输入数据,就没有陷阱
当然,也没有有用的数据:
与“out”或“ref”相反,C似乎没有io标记
如果我将'buf'参数设为'ref',那么C将发送
缓冲区地址,如C中的char**buf。C代码可以
取消引用,查找数据。。。但如果数据发生变化,则
调用C代码看不到更改的数据
所以,要问一个正式的问题:如何从
从C到C,并将修改后的数据取回
谢谢,
斯坦你有没有试过用谷歌搜索:第一页至少有四个答案!C代码中ss_upshift1的签名是什么?alk…sheesh。首先,我说我找过了。第二,我没有提到字符串有一个很好的理由。我只做了45年以上的编程,但我了解到“字符串”并不总是指“字符数组”:第三,搜索的前五次点击中没有一次讨论字节数组或I/O参数,这些参数是用于将数据传递到函数并返回数据的参数,简言之,它们都不处理从C例程获取数据的问题。提示:C代码中的const char*s表示您没有更改数据。[more next][oart 2…stackoverflow拒绝给我足够长的alk回复:]第四,并非所有支持字符串的语言都可以轻松地在字符串中使用8位数据,例如,在某些语言中,ASCII NUL二进制0终止字符串。第五,礼貌很重要。。。不知道你在问什么,或者为什么。除非你猜测某个神秘权威没有签署我的C代码,因此C/VS故意地、悄悄地丢弃C例程的输出?对于这个问题,ss_升档例行程序的内部内容应该无关紧要。事实上,我应该称之为例行的foo,因为我不希望答案像C中的升档,请这样做谢谢