【问题标题】:Including a PCL library DLL in a C++ winrt Project在 C++ winrt 项目中包含 PCL 库 DLL
【发布时间】:2013-01-24 19:58:42
【问题描述】:

我创建了要在各种 WinRT 项目中使用的可移植类库。我可以在 C# Winrt Apps、VB WinRT Apps、silverlight 和 Windows Phone 中使用这个 PCL dll。但由于某种原因,我无法成功地将库添加到我的 C++ 项目中。我尝试这个时得到的错误是:

无法添加对文件“C:\Users\xyz\pqr.dll”的引用,因为它是 既不是 .NET 程序集也不是注册的 ActiveX 控件。

我早些时候在 SO 上看到了 same question,并且 OP 发布了一个似乎对他有用的解决方案。我试图按照原始问题的建议找到以下行,但在 vcxproj 文件中找不到它。

<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>

由于我无法对原始问题发表评论,我想我应该在这里发布另一个问题。

有什么想法吗?

编辑: 我的项目设置如下所示:

  • 假设我的 PCL 库名为 A.dll。
  • 我的 WinRT 组件名为 B.winmd。
  • 现在,B.winmd 在内部使用 A.dll 并围绕它创建一个包装器。

现在,当我想在 C++ 中创建 Store App C 时,我必须在我的项目 C 中添加对 A.dll 和 B.winmd 的引用。如果我只包含 B.winmd,我首先会得到一个运行时异常使用 A.dll 中的东西的时间。我做错了什么?

【问题讨论】:

    标签: visual-c++ windows-runtime portable-class-library


    【解决方案1】:

    C++ 应用程序不知道如何执行托管代码。如果您想使用 C# 创建一个库并使其可用于另一个运行时环境(如 C++ 或 Javascript),那么您必须创建一个 Windows 运行时组件项目。它的公共接口仅限于 WinRT 兼容类型,以允许运行时环境之间的互操作工作。还有很多其他的小规则。

    MSDN 起始页is here

    【讨论】:

    • 我想知道PCL中有多少类型与WinRT不兼容。如果这些融合在一起肯定会很好。
    • 我同意。但我认为我使用的是正确的 PCL 子集,因为我的 winmd + dll 设置在 C# 和 VB winrt 应用程序上运行良好,但我无法让它在 c++ 上运行。
    • 使用 PCL 没关系。 C++ 代码只能使用 WinRT 类型,它不知道 .NET 类型的 bean。仅当您希望其他平台(手机、xbox 等)上的托管代码使用您的库时,PCL 才有意义。
    • 正确,但是 WinRT 将 .NET 类型从 .NET WinRT 组件投影到可用于其他语言的类型。如果 PCL 组件可以同时是 WinRT 组件 - 您可以在所有风格的 .NET 和 WinRT 中使用它。
    • hmm... 那么这是 Visual Studio 强加的人为限制吗?当我将 PCL 库复制到 Debug\CppApp\AppX\ 文件夹时,应用程序开始按预期工作。我只是不知道如何打包我的组件,以便 DLL 到达 appx 文件夹。
    【解决方案2】:

    您的消息应该是一个很好的提示 - PCL 库是一个 .NET 库。 WinRT 项目需要 WinRT 组件。您需要创建一个基于 .NET 的 WinRT 组件,该组件将包装您的 PCL 库以使其可用于非 .NET 语言。

    【讨论】:

    • 我不确定您所说的“将您的 PCL 库包装到...的组件”是什么意思。我确实有一个使用 PCL 库的 Winrt 组件。但是,如果我在没有引用 PCL dll 的情况下引用 winmd 文件,则会出现错误。我是否只需将 dll 复制到与 winmd 文件相同的目录中就可以正常工作?
    • 如果您在 VS 中创建新的 Windows 应用商店项目 - 您将看到的模板之一是“Windows 运行时组件”。我认为您需要在该组件中引用您的 PCL 库,并为您希望向其他 WinRT 语言公开的每个 PCL 符号创建一个代理类型/方法/成员。
    • 我认为我没有正确理解这一点。让我们假设我的 PCL 库名为 A.dll。我的 WinRT 组件称为 B.winmd。现在,B.winmd 在内部使用 A.dll 并围绕它创建一个包装器。现在,当我想创建商店应用程序 C 时,我必须在我的项目 C 中添加对 A.dll 和 B.winmd 的引用。如果我只包含 B.winmd,我第一次从 A 中得到运行时异常。使用了dll。我做错了什么?
    • 对不起,我以前没有这样做过,所以我不确定。就我个人而言,我只会在解决方案 C 中包含 A 和 B 的源项目。如果您想使用二进制文件并希望 A 始终与 B 一起部署 - 我认为 NuGet 仅适用于 .NET,但也许您可以编写一个类似Tim Heuer's post。否则 - 您可能只需要引用两者来强制它们都与您的应用程序一起部署。
    • 再次感谢您的耐心。在我上一篇文章之后,我手动将 A.dll 复制到了 App C 的 AppX 目录中,一旦我这样做了,该应用程序就可以正常工作了。所以我不认为这是关于不存在支持的问题。我只需要弄清楚如何正确打包它,以便将 A.dll 和 B.winmd 部署在一起。 (A.dll 和 B.winmd 应该是我正在开发的 SDK 的一部分,因此将源代码包含在与 C 相同的解决方案中对我来说不是一个解决方案。)再次感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多