为啥将错误的指针从 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++ win32 本机 dll 的最有效方法是啥?