Search code examples
c#winapiazure-devopsazure-pipelineswinmd

Referencing Windows SDK winmd files and VS Team Services build


I have created a C# .Net Standard library which references two Windows SDK libraries.

enter image description here

The references are

  • 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

This works on my local dev machine.

VS Team Services build first shows the following warning:

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.

Later it fails with the following error:

Error CS0246: The type or namespace name 'Windows' could not be found (are you missing a using directive or an assembly reference?)

Naively, I thought I just have to set Copy Local to True in Visual Studio to true and everything will be fine. I was wrong.

Question

How to, in VSTS, build projects which reference SDK winmd files?


Solution

  • Refer to these steps to deal with this issue:

    1. Right click the project in Visual Studio > Edit {project name}
    2. Replace the relative paths of these assemblies to absolute paths

    Sample code:

    <ItemGroup>
        <Reference Include="Windows.Foundation.FoundationContract">
          <HintPath>C:\Program Files (x86)\Windows Kits\10\References\10.0.16299.0\Windows.Foundation.FoundationContract\3.0.0.0\Windows.Foundation.FoundationContract.winmd</HintPath>
          <IsWinMDFile>true</IsWinMDFile>
        </Reference>
        <Reference Include="Windows.Foundation.UniversalApiContract">
          <HintPath>C:\Program Files (x86)\Windows Kits\10\References\10.0.16299.0\Windows.Foundation.UniversalApiContract\5.0.0.0\Windows.Foundation.UniversalApiContract.winmd</HintPath>
          <IsWinMDFile>true</IsWinMDFile>
        </Reference>
      </ItemGroup>