我似乎无法弄清楚如何将数组从导出的C++ DLL返回到我的C#程序.我在google搜索中找到的唯一一件事就是使用Marshal.Copy()将数组复制到缓冲区中,但这并没有给我我想要返回的值,我不知道它给了我什么.
这是我一直在尝试的:
导出功能:
extern "C" __declspec(dllexport) int* Test()
{
int arr[] = {1,2,3,4,5};
return arr;
}
Run Code Online (Sandbox Code Playgroud)
C#部分:
[DllImport("Dump.dll")]
public extern static int[] test();
static void Main(string[] args)
{
Console.WriteLine(test()[0]);
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
我知道返回类型int []可能是错误的,因为托管/非托管差异,我只是不知道从哪里开始.除了将字符数组返回到字符串而不是整数数组之外,我似乎无法找到答案.
我想到我使用Marshal.Copy获得的值不是我返回的值的原因是因为导出函数中的'arr'数组被删除但是我不是100%肯定,如果有人可以清除它那太好了.
我只是尝试使用 fread 读取文件并输出内容。它部分工作。它正确输出所有内容,但以一堆随机字符结尾。
#include <iostream>
using namespace std;
void ReadFile(char* filename,char*& buffer)
{
FILE *file = fopen(filename,"rb");
fseek(file,0,SEEK_END);
int size = ftell(file);
rewind(file);
buffer = new char[size];
memset(buffer,0,size);
int r = fread(buffer,1,size,file);
cout << buffer;
fclose(file);
}
int main()
{
char* buffer;
ReadFile("test.txt",buffer);
cin.get();
}
Run Code Online (Sandbox Code Playgroud)
假设在这种情况下“大小”是 50。出于某种原因,调用 fread 后缓冲区的大小最终为 55 或 56。我在使用它之前清空了缓冲区并尝试输出它,一切正常(它是空的)。在调用 fread 之后,缓冲区以某种方式变大并填充了随机字符。我已经在十六进制编辑器中打开了文本文件,以确保没有我没有看到但没有看到的任何内容。该文件为 50 字节。fread 返回读取的字节数,在这种情况下返回到 'r','r' 应该是什么。那么这些字节的母 eff 是从哪里来的呢?
简化: fread 返回正确的读取字节数,但缓冲区在调用 fread 后以某种方式使自身变大,然后用随机字符填充它。为什么?
我一生都无法弄清楚这是怎么发生的。
此外,在任何人给我一个简单的修复之前,我已经知道我可以只做 buffer[r] = '\0' 并且不再输出随机字符,但我更想知道为什么会这样。