【问题标题】:Convert IntPtr to int* in C#?在 C# 中将 IntPtr 转换为 int*?
【发布时间】:2009-05-06 17:47:18
【问题描述】:

我有一个 C++ DLL 将 int* 返回给 C# 程序。问题是 C# 中的 int* 在赋值后仍然是 null

当我将 C++ 结果分配给 IntPtr 时,我得到一个正确的非空值。但是,任何将其转换为int* 的尝试都会导致null

我试过了:

IntPtr intp = cppFunction ();           // Non-null.

int* pi = (int *) intp;                 // Results in null.

int* pi = (int *) intp.ToPointer ();    // Results in null.


void* vp = intp.ToPointer ();

int* pi = (int *) vp;                   // Results in null, but vp is non-null.

我怎样才能得到一个非空的int*

谢谢! 艾伦

【问题讨论】:

  • 我使用来自 msvcrt.dll 的标准 malloc() 函数作为“cppFunction()”。它对我来说没问题,我什至可以读/写分配的内存位置。当我为 intp (IntPtr intp = (IntPtr)1000;) 分配一个随机数时,仅在取消引用时才得到 NullPointerException。尽管如此,指针的值永远不会为空......你能给我一个产生不正确结果的小而完整的程序吗?
  • 您是否可以选择重构 C++ 以便可以传入分配了所需内存的 IntPtr?那样会更好 - 或者按照stackoverflow.com/questions/9378626/… 连接回调以在 C# 中分配内存

标签: c# pointers intptr managed-code


【解决方案1】:

你的 cppFunction 声明应该是这样的:

void cppFunction(ref int* ptr) {
   ptr = somevalue;
}

这应该可以解决您的问题。

您可能会发现这也很有用: http://www.pcreview.co.uk/forums/thread-2902012.php

【讨论】:

  • 谢谢詹姆斯。我尝试了这样的方法: [DllImport("vdrdll.dll", EntryPoint = @"?getLineContentsAsArg@@YAXAAAPAH@Z")] public unsafe static extern void getLineContentsAsArg (ref int* lca); DLLEXPORT void getLineContentsAsArg (int*& lca) { lca = calculateLineContents ();在 DLL 中分配了一个指针值,但是当它返回到 C# 时,它为空。我查看了您的示例,只有最后一个尝试分配给 C# 中的指针变量。每次我尝试过这个,分配的结果都是空的。你能看出我做错了什么吗?谢谢!
  • 当我完成割草时,我需要多看一下它,但是,我意识到最近我解决这个问题的方法是在 C# 中分配了一个缓冲区,将指针发送到非托管代码,以及使用 IntPtr 获取长度。您遇到的问题可能是由于您希望 C++ 函数执行 malloc 并返回字符串。在这种情况下,您可能需要将一个指针传递给该指针,但我不确定当您完成后如何在 C# 中释放它。
  • 如果您需要非托管代码来执行 malloc,但您希望它在托管地址空间中,您可以提供void* callback(int length) 形式的回调,以便非托管代码可以要求托管代码执行分配。较新的 C# 版本支持非托管委托,并且需要定义回调。另一种选择是传递一个保证足够大的缓冲区:int cppFunction(ref int* ptr, void* buffer) 其中int 返回值是写入buffer 的字节数
猜你喜欢
  • 2013-08-12
  • 2010-10-20
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多