为啥将错误的指针从 C# 传递到我的本机导出方法中?

Posted

技术标签:

【中文标题】为啥将错误的指针从 C# 传递到我的本机导出方法中?【英文标题】:Why is a bad pointer being passed into my native exported methods from C#?为什么将错误的指针从 C# 传递到我的本机导出方法中? 【发布时间】:2014-08-06 05:40:21 【问题描述】:

这是我的 C# 代码:

    [DllImport("Tomb.dll")]
    public static extern unsafe uint InjectManualMap(ulong pId, [MarshalAs(UnmanagedType.LPCStr)]string dllPath);

无论出于何种原因,当我尝试使用我的 C++ 代码时:

extern "C" DllExport unsigned int StdCall InjectManualMap(unsigned long pid, const char* dllPath) 
     ManualMapInjector* mmp = new ManualMapInjector;
     std::string dll(dllPath);
     unsigned int kk = mmp->Inject(pid, dll);
     delete mmp;
     return kk;

const char* dllPath 始终是错误指针 (0x000000000)。 我不确定这里发生了什么,因为所有其他解决方案都指向使用 StringBuilder(经过测试,做了同样的事情),或者使用 MarshalAs,这是我发布的当前代码所做的事情。

【问题讨论】:

出于好奇,如果您保留string,但删除MarshalAsAttribute,会发生什么?我看到的应该有效的示例没有使用MarshalAs。 ***.com/questions/20752001/… 不幸的是,同样的事情发生了。我无法让它以任何方式工作。 您为dllPath 传递的内容可能存在问题。这个页面上有一些我在其他地方没有提到的不错的建议——manski.net/2012/06/pinvoke-tutorial-passing-strings-part-2 【参考方案1】:

问题是 C# long 是 64 位宽,但 C++ long 在 Windows 上是 32 位宽。 pinvoke 应该是:

[DllImport("Tomb.dll")]
public static extern uint InjectManualMap(uint pId, string dllPath);

请注意,我还删除了不需要的 unsafe 指令和 MarshalAs 属性。

【讨论】:

谢谢。您可能愿意接受答案。我知道你是新来的,这就是我提到它的原因。 我没有意识到按钮在哪里!我一直来***,但直到现在我才注册。再次感谢您的帮助! :)

以上是关于为啥将错误的指针从 C# 传递到我的本机导出方法中?的主要内容,如果未能解决你的问题,请参考以下文章

创建可以从 c# 和 c++ 中使用的 c# dll

如何将整数从 C# 方法复制到本机 C DLL 函数

将对象列表从 c# 传递到糟糕的 c++ win32 本机 dll 的最有效方法是啥?

SWIG:如何将 C++ 对象数组从 C# 传递到 C++?

如何正确地将浮点指针从 C 库传递到其 C# 包装器

将 C# 函数指针传递到 C++/CLI 互操作 dll