如何从 Metro P/Invoke 到本机 dll?

Posted

技术标签:

【中文标题】如何从 Metro P/Invoke 到本机 dll?【英文标题】:How to P/Invoke to a native dll from Metro? 【发布时间】:2011-12-10 01:52:29 【问题描述】:

我有一个由两部分组成的库 - 一个 .net 程序集,P/Invokes 到一个本地 3rd 方 dll。在桌面模式下,这工作得很好:但是,当从 Metro 风格应用程序引用程序集并运行它时,它会在 P/Invoke 上引发 System.DllNotFoundException 抱怨“无法加载 DLL 库”:指定的模块无法找到了。”

本机 dll 没有做任何特殊的事情,只是创建到服务器的传出 TCP/IP 连接。系统无法知道这一点,而是本机 dll 可以做任何事情。这就是为什么我怀疑它可能无法做到这一点。

msdn 上提到了一些关于 Metro 风格应用程序的 dll 搜索顺序,暗示可以加载本机 dll?

我还发现这个link on msdn 谈论加载“库”并在清单文件中提到 PackageDependency,但对我来说仍然不清楚 如何以可能的方式将本机 dll 添加到包中到P/Invoke它

【问题讨论】:

您可以尝试将 DLL 中的 TCP/IP 内容注释掉并再次测试吗?这将区分未找到 DLL 和未找到其依赖项。另外,您是否勾选了要使用传出 Internet 连接的功能? 我没有构建 dll。它不是解决方案的一部分。所以我无法改变 dll 的构建方式。好点,它可能是导致错误的一些次要依赖!将尽快检查。 @vidstige 您现在可能已经解决了这个问题,否则请查看my answer 的相关问题。 @AndersGustafsson 我在两者之间换了工作,所以我无法尝试:-S。我很确定这是我尝试的第一件事。 【参考方案1】:

将它添加到您的项目中(右键单击项目,添加,现有项目。)检查该项目的属性中,内容设置为 True(默认为 false。)构建。

【讨论】:

感谢您的回答。这适用于普通的 c# 环境,但我尝试过,但无法让它在 Metro-project 上运行。 描述“不工作” - 编译错误?启动时出现神秘绿屏?运行时抛出异常? 我用特定的错误消息更新了问题!调用具有 P/Invoke 属性的方法时会引发异常。【参考方案2】:

这可能是设计使然。您的问题可能是由从 LoadLibrary 返回的错误代码 126 的错误引起的。 如果您的应用程序在桌面模式下运行,您应该为您的应用程序定位桌面模式。您也可以使用早期版本的 Windows。

【讨论】:

以上是关于如何从 Metro P/Invoke 到本机 dll?的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何使用 P/Invoke 将字符串数组传递给 C 库?

为啥这个显式 P/Invoke 不起作用?

CPU 体系结构独立 P/Invoke:DllName 或路径可以是“动态的”吗?

在多线程应用程序中使用带有媒体基础接口的 P/Invoke 发生 AccessViolationException

从 p/invoke 修改结构布局

P/Invoke 从 C# 到 C++ 的外部方法