在智能设备项目中,我正在尝试Pinvoke应该在mscoree.dll中可用的功能。相关定义如下:
[DllImport("mscoree.dll", EntryPoint = "#29")]
internal static extern int Object_GetHashCode(object obj);
您可以在mscorlib.dll的内部类EE中使用Reflector找到它。请注意,此函数是从Object.GetHashCode()调用的。
我有一个间接调用Object_GetHashCode的智能设备测试项目。当我在桌面上运行它时一切正常。当我在模拟器上运行它时,我收到以下错误:
System.MissingMethodException:在PInvoke DLL“mscoree.dll”中找不到入口点“#29”。
为什么会这样?在模拟器和桌面上运行的mscorlib.dll不完全相同吗?看起来是这样,因为当我查看在.NETCFv35.ppc.armv4.cab中分发的mscorlib.dll附带的Object.GetHashCode()的实现时,我发现它也调用了EE.Object_GetHashCode()。为什么mscorlib.dll可以调用mscoree.dll而我不能?
修改:
Visual Studio项目中的mscorlib引用指向以下文件
C:\ Program Files \ Microsoft.NET \ SDK \ CompactFramework \ v3.5 \ WindowsCE \ mscorlib.dll(210kB)
但默认情况下Reflector显示以下文件的内容:
C:\ Program Files \ Microsoft.NET \ SDK \ CompactFramework \ v3.5 \ Debugger \ BCL \ mscorlib.dll(920kB)
这些文件具有System.Object.GetHashCode()的不同实现。前者只是空,而后者看起来如下:
public virtual int GetHashCode()
{
return EE.Object_GetHashCode(this);
}
实际上前一个文件中的所有方法似乎都是空的,而小得多的大小似乎暗示了前一个文件只是一个占位符的方向,所以VS可以引用一些东西?
最后,我试图在模拟器上的文件中找到mscorlib.dll但是失败了。安装程序日志文件说安装位置是\ Windows但是在任何地方都没有mscorlib.dll。这东西在哪里?
总的来说,当谈到CF时,我很难用谷歌搜索答案,不知道为什么?
P.S。我正试图找到this问题的答案。
答案 0 :(得分:2)
你根本无法假设入口点将处于相同的序数。实际上,假设它们在相同的DLL版本中保持相同是不明智的,即使在同一平台上也是如此(这意味着在桌面上调用序号29可能在该版本中工作,但是你的后续函数可以在下一个版本中轻松移动什么时候重新编译和链接)。通过序数调用是方式,方式,方式脆弱和风险。
答案 1 :(得分:0)
在Windows CE设备中,Win32函数不一定与它们的桌面等效文件位于相同的dll文件中。大多数功能都位于coredll.dll中。先试试这个。如果它不起作用,您需要在Windows CE设备中找到dll的名称。 MSDN可能很有用。另请尝试使用Platform Builder文档。
答案 2 :(得分:0)
我可以问一个愚蠢的问题吗?为什么要尝试P / Invoke Object.GetHashCode()
?如果我有Object
类型的对象,我可以直接从托管代码调用该方法,不需要P / Invoke。
答案 3 :(得分:0)
您是否尝试使用Dependency Walker检查DLL?至少,这应该允许您将“#29”替换为函数的名称。