如何在Xamarin.iOS项目中使用自定义条件属性排除程序集引用

如何在Xamarin.iOS项目中使用自定义条件属性排除程序集引用,xamarin.ios,conditional,project,csproj,assembly-references,Xamarin.ios,Conditional,Project,Csproj,Assembly References,我在Xamarin.iOS中有一个解决方案,该项目为非常大的本机库引用了非常大的DLL绑定。所以解决方案的构建时间非常长。在任何源文件中进行简单修改后,我需要等待链接。因此,我的想法是使用自定义属性从项目中排除引用,并在.cs文件中使用define来排除依赖于大型程序集的代码。但我无法使用自定义条件排除引用。以下策略不适用于Xamarin.iOS,但适用于Visual Studio: 创建CommonProperties.prop文件: <Project ToolsVersion="4.0

我在Xamarin.iOS中有一个解决方案,该项目为非常大的本机库引用了非常大的DLL绑定。所以解决方案的构建时间非常长。在任何源文件中进行简单修改后,我需要等待链接。因此,我的想法是使用自定义属性从项目中排除引用,并在.cs文件中使用define来排除依赖于大型程序集的代码。但我无法使用自定义条件排除引用。以下策略不适用于Xamarin.iOS,但适用于Visual Studio:

创建CommonProperties.prop文件:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <LinkWithLargeAssembly>True</LinkWithLargeAssembly>
    </PropertyGroup>
</Project>
所以这个想法是:当它不是关键的时候,我可以将LinkWithLargeAssembly定义为False,并快速链接我的项目。CommonProperties.prop可以导入到依赖于大型库功能的任何程序集中

在项目文件.csproj中,导入上述文件并尝试排除引用,例如monotouch:

...
<Import Project="CommonProperties.prop" />
...
<ItemGroup>
    <Reference Include="monotouch" Condition=" '$(LinkWithLargeAssembly)' == 'True' " />
</ItemGroup>
...
我还尝试在项目文件中直接定义属性$LinkWithLargeAssembly,而无需导入。此外,我还尝试使用已定义的属性,例如$RootNamespace和$AssemblyName。但条件属性仅适用于属性$Configuration和$Platform。也就是说,根据配置,以下代码将包括和排除monotouch:

<ItemGroup>
    <Reference Include="monotouch" Condition=" '$(Configuration)' == 'Debug' " />
</ItemGroup>

是否可以自定义程序集引用,包括使用我自己的条件属性?

我通过添加从调试复制的新生成配置解决了这个问题。我把它命名为DebugNoLargeLib。因此,我可以使用以下代码排除引用,因为$Configuration属性将被正确解析:

<ItemGroup>
    <Reference Include="SomeLargeLib.dll" Condition=" '$(Configuration)' != 'DebugNoLargeLib' " />
</ItemGroup>
在我将预处理器指令NO_LARGE_LIB添加到编译器部分以进行配置DebugNoLargeLib之后

因此,现在我能够在没有大型库的情况下进行链接,并从编译中排除依赖于它的代码


但我认为这是Xamarin方面的一个错误,即根据Microsoft规范,项目文件处理不完全受支持。

我通过添加从调试复制的新构建配置解决了这个问题。我把它命名为DebugNoLargeLib。因此,我可以使用以下代码排除引用,因为$Configuration属性将被正确解析:

<ItemGroup>
    <Reference Include="SomeLargeLib.dll" Condition=" '$(Configuration)' != 'DebugNoLargeLib' " />
</ItemGroup>
在我将预处理器指令NO_LARGE_LIB添加到编译器部分以进行配置DebugNoLargeLib之后

因此,现在我能够在没有大型库的情况下进行链接,并从编译中排除依赖于它的代码

但我认为这是Xamarin方面的错误,即根据Microsoft规范,项目文件处理不完全受支持