【问题标题】:Use old C/C++ library with windows 8 metro app将旧的 C/C++ 库与 Windows 8 Metro 应用程序一起使用
【发布时间】:2012-10-15 10:51:18
【问题描述】:

我正在尝试使用用 C/C++ 编写的开源库 (Linphone) 为 Windows 8 / Windows Phone 8 创建一个应用程序(在 C# 中)。 我尝试在VS11中导入它,没有成功。 我有所有可能需要的 .dll 文件。

有没有办法在有或没有 VS11 的情况下使用这个库来创建我的应用程序?

谢谢。

【问题讨论】:

  • Visual Studio 11 到底是什么?支持现代 UI 应用程序的唯一 Visual Studio 版本是 Visual Studio 2012。您需要重新编译库才能执行此操作。

标签: c# windows-8 microsoft-metro


【解决方案1】:

您不能在 Windows 8 应用商店应用中使用使用旧版 Visual Studio(早于 Visual Studio 2012)构建的二进制文件。

原因是因为使用 Visual Studio 2010 构建的二进制文件将依赖于 Visual Studio 2010 中的 C++ 运行时 DLL。而您的应用程序的其余部分是使用 Visual Studio 2012 编写的,因此它将依赖于Visual Studio 2012 中的 C++ 运行时 DLL。后者可从 Windows 应用商店自动获得(read this 了解更多详细信息)。但是前者在 Windows 应用商店中不可用。此外,您的应用无法表达对 VC2010 运行时的依赖。在应用程序包中包含 VC2010 运行时 DLL 也将不起作用,因为该包将在商店上传时被拒绝。

因此,最好的选择是严格使用 Visual Studio 2012 为您的 Windows 8 应用商店应用构建所有源代码。

【讨论】:

  • 正如我在帖子的 cmets 中所说,VS11 是 Visual Studio 2012。
  • 我知道。您是否也使用 VS11 构建了 C++ 库?
  • 是的,事实上我做到了。
【解决方案2】:

您不会“导入”非托管 dll。相反,您使用 PINvoke 来调用他们的方法。

看这个:

http://msdn.microsoft.com/en-us/magazine/cc164123.aspx

【讨论】:

  • 虽然此答案在技术上是正确的,但 WinRT 应用程序无法导入非 WinRT dll,因此使此答案不正确。
  • 他们在文章中说:本月专栏介绍的P/Invoke 特性足以调用Windows 中的许多API 函数。但是,如果您的互操作需求很大,您最终会发现自己正在编组复杂的数据结构,甚至可能需要通过托管代码中的指针直接访问内存。事实上,与本机代码的互操作可以是一个名副其实的潘多拉魔盒,其中包含细节和低级位。我需要与我的库进行大量双向交互...
  • 我是否必须为我的 dll 中的每个函数执行 [DllImport("C_DLL.dll", EntryPoint="DoSomethingInC")] public static extern void DoSomethingInC(ushort ExampleParam, char AnotherExampleParam);(就像在 JNI 中一样)?
  • 是的,您需要声明每个本机函数。对不起,我错过了你使用win8的事实,我没有这方面的经验,也许你的dll可能以某种特殊的方式构建..
  • 所以“基本上”我使用我的 dll 在 C++ 中创建了一个 WinRT 组件,并将每个函数定义为 extern,然后我将该组件导入到我的 C# 应用程序中?
猜你喜欢
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 2014-07-05
相关资源
最近更新 更多