标签: winmd

BuildManager使用另一个版本的MSBuild

以下代码尝试以编程方式构建解决方案,使用BuildManager:

ProjectCollection pc = new ProjectCollection();
pc.DefaultToolsVersion = "12.0";
pc.Loggers.Add(fileLogger);
Dictionary<string, string> globalProperty = new Dictionary<string, string>();
BuildRequestData buildRequest = new BuildRequestData(solutionName, globalProperty, null, new[] { "Build" }, null);

BuildParameters buildParameters = new BuildParameters(pc)
{
    DefaultToolsVersion = "12.0",
    OnlyLogCriticalEvents = false,
    DetailedSummary = true,
    Loggers = new List<Microsoft.Build.Framework.ILogger> { fileLogger }.AsEnumerable()
};

var result = BuildManager.DefaultBuildManager.Build(buildParameters, buildRequest);
Run Code Online (Sandbox Code Playgroud)

当我运行此代码(它没有构建任何btw)时,我可以看到csc.exe除了一个特定版本之外还使用了以下编译器winmdexp.exe:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Csc.exe
ExportWindowsMDFile:
    C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\winmdexp.exe 
Run Code Online (Sandbox Code Playgroud)

但是当我使用VS IDE成功构建解决方案时,会出现以下信息:

C:\Program Files (x86)\MSBuild\12.0\bin\Csc.exe
ExportWindowsMDFile:
    C:\Program Files …
Run Code Online (Sandbox Code Playgroud)

c# msbuild solution microsoft.build winmd

9
推荐指数
1
解决办法
4947
查看次数

如何读取 winmd(WinRT 元数据文件)?

WinMD 是一个二进制数据文件,其中包含您需要了解的有关本地 WinRT dll 中可用的命名空间、类型、类、方法和参数的所有信息。

Windows 运行时设计

Windows 运行时使用 API 元数据(.winmd 文件)公开。这与 .NET 框架 (Ecma-335) 使用的格式相同。底层二进制合同使您可以轻松地直接使用您选择的开发语言访问 Windows 运行时 API。

每个 .winmd 文件公开一个或多个命名空间。这些命名空间按它们提供的功能分组。命名空间包含类、结构和枚举等类型。

伟大的; 我如何访问它?

Winmd 是 COM

引擎盖下的 WinRT 仍然是 COM。WinRT 中的 Winmd(Windows 元数据)是来自 COM 的旧 TLB(类型库)文件的现代版本。

| COM                        | WinRT                          |
|----------------------------|--------------------------------|
| CoInitialize               | RoInitialize                   |
| CoCreateInstance(ProgID)¹  | RoActivateInstance(ClassName)  |
| *.tlb                      | *.winmd                        |
| compiled from idl          | compiled from idl              |
| HKCR\Classes\[ProgID]      | HKLM\Software\Microsoft\WindowsRuntime\ActivatableClassId\[ClassName] |
| Code stored in …
Run Code Online (Sandbox Code Playgroud)

com midl windows-runtime winmd

9
推荐指数
1
解决办法
2786
查看次数

如何打包Windows运行时组件以进行分发?

我已经构建了一个WinRT组件(.winmd)供JavaScript和XAML Windows Store应用程序使用.在JavaScript客户端中包含和引用松散的.winmd文件输出时,我看到此构建警告:

Microsoft.AppXPackage.Targets(808,9):警告APPX1707:没有为.winmd文件'myRuntimeComponent.winmd'提供实现文件.要在应用清单中生成注册信息,请在项目文件中的.winmd引用项上指定"实现"元数据.

我找不到有关此错误的任何文档或如何包含实现元数据.

运行JavaScript客户端时,调用从.winmd导出的类方法时抛出此异常:

0x80040154 - JavaScript运行时错误:未注册类

请注意,我在客户端应用程序项目中引用松散的.winmd文件,而不是引用构建.winmd的Visual Studio项目.我的用例是分发.winmd输出,而不是.winmd组件的完整源代码 - 源代码分发不是一个选项.

另请注意,当Windows运行时组件作为项目引用引用时,JavaScript客户端将构建并正确运行.C#XAML客户端可以使用项目引用或对松散.winmd的引用正确运行.

当引用松散的.winmd时,似乎在客户端应用程序构建中没有生成某些注册信息.

如何构建和分发松散的Windows运行时组件以供JavaScript和托管客户端使用?

windows-runtime winjs windows-store-apps winmd

6
推荐指数
1
解决办法
4338
查看次数

给定.winmd文件,我们在哪里可以找到真正的实现DLL?

我有一个问题,给定一个.winmd文件,我们在哪里可以找到真正的实现?.winmd文件就像一个头文件或动态库的.lib文件,它不包含任何实现,我很好奇它的实现在哪里.谢谢.

.net windows-runtime winmd

4
推荐指数
2
解决办法
1156
查看次数

引用 Windows SDK winmd 文件和 VS Team Services 构建

我创建了一个 C# .Net Standard 库,它引用了两个 Windows SDK 库。

在此处输入图片说明

参考文献是

  • C:\Program Files (x86)\Windows Kits\10\References\10.0.16299.0\Windows.Foundation.FoundationContract\3.0.0.0\Windows.Foundation.FoundationContract.winmd
  • C:\Program Files (x86)\Windows Kits\10\References\10.0.16299.0\Windows.Foundation.UniversalApiContract\5.0.0.0\Windows.Foundation.UniversalApiContract.winmd

这适用于我的本地开发机器。

VS Team Services 构建首先显示以下警告:

2018-06-13T01:17:22.3393846Z ##[warning]C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets(2106,5): Warning MSB3245: Could not resolve this reference. Could not locate the assembly "Windows.Foundation.FoundationContract". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.

后来它失败并出现以下错误:

Error CS0246: The type or namespace name 'Windows' could not be found (are you missing a …

c# winapi winmd azure-devops azure-pipelines

2
推荐指数
1
解决办法
777
查看次数

如果我仍然需要 .dll 和 .pri 文件,那么使用 .winmd 库有什么意义?

我想使用 winfbsdk(请参阅此处),这是一个用于在 UWP(通用 Windows 应用程序 (Windows 10))内使用 Facebook 的 SDK。但似乎.winmd构建的文件不足以使用该库。我可以执行以下操作之一:

  1. 参考文档中所述的整个项目。

或者

  1. 引用该.winmd文件,同时复制生成的.DLL文件.pri

为什么是这样?

dll shared-libraries winmd visual-studio-2015

2
推荐指数
1
解决办法
1451
查看次数