我正在尝试创建一个用C#编写的DLL,它将使用{8.1}包,例如Windows.Storage
和Windows.Media
。当不包括使用csc.exe
包的类时,DLL使用Windows
进行编译。
当尝试编译整个DLL(包括额外的类)时,我添加了/r:"C:\Program Files (x86)\Windows Kits\8.1\References\CommonConfiguration\Neutral\Windows.winmd"
编译器选项以包含缺少的Windows包。编译器然后抛出此错误:
c:\ Program Files(x86)\ Windows Kits \ 8.1 \ References \ CommonConfiguration \ Neutral \ Windows.winmd:error CS0012:类型'System.Attribute'在 未引用的程序集。您必须添加对程序集的引用 'System.Runtime,Version = 4.0.0.0,Culture = neutral, 公钥= b03f5f7f11d50a3a”。
但是,当我尝试包含C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.dll
时,编译器几乎为我使用的每个类error CS0433
提供了The type '...' exists in both '...\mscorlib.dll' and '...\Runtime.dll'
。
有没有办法只包含Runtime.dll中必需的包?或者是否有一种完全不同的方式来轻松编译这个DLL?
答案 0 :(得分:0)
要解决此问题,请添加对System.Runtime.dll外观的引用。通常,此外观位于System.Attribute
。
这里的根本问题是不同的.NET实现在不同的程序集上定义System.Attribute
类型。但是,.NET / Windows类型的投影层 - 使Windows运行时类型的粘合剂看起来像普通的.NET类型 - 并且编译器期望在System.Runtime.dll中定义System.Attribute
。对于某些.NET实现来说,情况确实如此,但对于Windows附带的内置.NET Framework则不然。
上面引用的Facade提供了一个指向编译器的指针,windowid
的实现实际上在System.dll中用于此实现。