【问题标题】:How to add unmanaged C++ dll into a Silverlight 5 project如何将非托管 C++ dll 添加到 Silverlight 5 项目中
【发布时间】:2013-03-12 14:00:03
【问题描述】:

我需要在 Silverlight 5 项目中使用我自己的非托管 C++ dll。

因为我可以使用 dllImport 来使用它,即

   [DllImport(@"D:\myLib\Debug\myLib.dll")]
    static extern int add(IntPtr ptr);

当我在 DllImport 中提到了一条绝对路径时,它运行良好。但我的问题是,我想使用相对路径。

因为我需要在我的 silverlight 5 项目中添加非托管 C++ dll 并从那里指定路径。 我从过去两天开始进行调查,但没有找到任何解决此问题的方法。

只有我找到了下面提到的一个相关链接,但它也没有帮助。

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.dllimportattribute.aspx

因为它建议如何将非托管 dll 嵌入到托管程序集中。 我尝试了这种方法,但我得到了“BadImageException”。

请建议不要解决这个问题,因为它对我来说真的很紧急。

谢谢,

维平

【问题讨论】:

  • DllImportAttribute 不会将非托管库嵌入到您的 Silverlight 应用程序中(顺便说一句,绝对避免这种绝对路径)。它只是添加一个对该库的引用,但它必须单独下载和安装
  • 您的 SL5 应用程序是否以提升的权限运行?如果没有,我不希望能够使用非托管 DLL。
  • BadImageFormatException 页面有一个“备注”部分,概述了您收到此错误的可能原因。我会检查它们,看看是否有助于解决问题。
  • BadImageFormatException 可能是 32 位与 64 位的问题。确保 Silverlight 安装程序以与本机 DLL 相同的位数运行。

标签: c# c++ silverlight-5.0


【解决方案1】:

当 Silverlight 5 Release Candidate 公开时,我创建了一些支持方法来处理将非托管非系统 DLL:s 与 Silverlight 5 RC 应用程序捆绑在一起的问题。该解决方案仍然有效,因为微软没有添加任何支持来处理 Silverlight 5 RTM 中的捆绑问题。

我所做的基本上是将非托管 DLL 捆绑为资源文件。通过手动调用的辅助方法,例如在应用程序启动事件处理程序中,资源被复制到磁盘上的预定义位置。然后在执行期间此位置也会包含在系统 PATH 中。

需要高度信任(当然)。

有关此解决方案的更多详细信息,请参阅 this 博客文章。

与此解决方案相关的所有代码,包括示例测试,都可以在 Github 上找到。

更新

正如 Simon Mourier 在下面的评论中指出的那样,一种选择也是通过在DLL 已从资源中解压缩。在 this 博客文章中更详细地描述了 Silverlight 的这种方法。

【讨论】:

  • 如果您在任何 P/Invoke 调用之前使用 LoadLibrary 函数(因为您确实有有效路径),也许您可​​以避免更改系统 PATH。在进程中加载​​ DLL 后,DllImport 应该会成功。它曾经在标准 .NET 上工作,我没有在 SL 中测试过。 msdn.microsoft.com/en-us/library/windows/desktop/ms684175.aspx
  • 非常感谢@SimonMourier 的评论。我没有考虑过这个选项,但它似乎是可行的。简单的谷歌搜索表明,其他人实际上已经在 SL 中使用这种方法取得了成功。我将使用这些新信息更新答案。
猜你喜欢
  • 2019-01-08
  • 2018-04-04
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
相关资源
最近更新 更多