Skip to content

ICU integration and asset loading overhaul #37971

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 68 commits into from
Jul 16, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
cbae5e5
initial static ICU implementation for wasm
EgorBo Jun 17, 2020
f9fc4e3
Update pal_icushim_internal.h
EgorBo Jun 17, 2020
bdc8955
Checkpoint
kg Jun 12, 2020
b3e2325
Add stubs for tz and calendar, enable tests
EgorBo Jul 2, 2020
ca35363
Update System.Private.CoreLib.Shared.projitems
EgorBo Jul 2, 2020
0659c74
Merge branch 'master' of github.com:dotnet/runtime into icu-loader
EgorBo Jul 10, 2020
72078b9
Fix EnumCalendarInfo for wasm (temp workaround)
EgorBo Jul 10, 2020
04993e8
Merge branch 'master' of github.com:dotnet/runtime into icu-loader-egor2
EgorBo Jul 13, 2020
901c499
cccc
EgorBo Jul 13, 2020
bf6587a
Fix small issues
EgorBo Jul 13, 2020
39c315a
drop ICU_REPO
EgorBo Jul 13, 2020
7c1855a
Update Program.cs
EgorBo Jul 13, 2020
e2a57ff
clean up
EgorBo Jul 13, 2020
f77ad54
Update tests.proj
EgorBo Jul 13, 2020
529e8e1
Update Program.cs
EgorBo Jul 13, 2020
c0fb094
Update tests.proj
EgorBo Jul 13, 2020
9698771
Checkpoint
kg Jul 14, 2020
6d5494a
Checkpoint
kg Jul 14, 2020
632d1fa
Checkpoint
kg Jul 14, 2020
99b64a0
Checkpoint
kg Jul 14, 2020
73e7ec3
Checkpoint
kg Jul 14, 2020
857cd9b
Fix formatting error
kg Jul 14, 2020
858a2af
Checkpoint
kg Jul 14, 2020
5ff4030
Checkpoint
kg Jul 14, 2020
df66deb
bump ICU nuget, skip some tests
EgorBo Jul 15, 2020
fea9e1b
Merge branch 'icu-loader' of github.com:kg/runtime into icu-loader
EgorBo Jul 15, 2020
bf979b3
Checkpoint
kg Jul 14, 2020
4872ae4
Fix whitespace
kg Jul 14, 2020
ec10683
Checkpoint
kg Jul 15, 2020
7ec82a8
Checkpoint
kg Jul 15, 2020
301b1e6
Address PR feedback, cleanup whitespace
kg Jul 15, 2020
563e985
Remove testing fallback URL
kg Jul 15, 2020
1a5f206
Switch back to using u_init because getCLDRVersion is broken.
kg Jul 15, 2020
a64b46a
Implement get_loaded_files
kg Jul 15, 2020
ea40744
Make loader diagnostic messages optional and off by default
kg Jul 15, 2020
642d35f
Also silence the loaded assets dict
kg Jul 15, 2020
960ebf0
Apply tracing flag to vfs logs as well
kg Jul 15, 2020
cb5c2b2
Merge branch 'master' of github.com:dotnet/runtime into icu-loader
EgorBo Jul 15, 2020
54401b4
ulocdata_getCLDRVersion works with new ICU nuget
EgorBo Jul 15, 2020
e6faed4
Merge branch 'master' of github.com:dotnet/runtime into icu-loader
EgorBo Jul 15, 2020
7f904dc
Update RegionInfoTests.cs
EgorBo Jul 15, 2020
5dbe40b
Update pal_icushim_internal.h
EgorBo Jul 15, 2020
5544389
Make sure the VFS files have write permissions
akoeplinger Jul 15, 2020
88a776a
Address feedback
EgorBo Jul 15, 2020
30af86f
Disable two tests in System.Runtime.Extensions
EgorBo Jul 15, 2020
801b95e
Add satellite assemblies to VFS
akoeplinger Jul 15, 2020
c06c63b
EnglishName_TestData is back to normal for ICU
EgorBo Jul 15, 2020
2e4ed37
Create and populate MONO.loaded_files
kg Jul 15, 2020
855b840
Add icu data file to runtimepack
akoeplinger Jul 15, 2020
4ea64d9
Adjust public interface for various bits of setup
kg Jul 15, 2020
3fb2ec9
Add compatibility shim for runtime_and_bcl, export some APIs
kg Jul 15, 2020
da89834
Remove now-broken ICUDataFiles parameter from csproj
kg Jul 15, 2020
4ac3230
Fix spurious ICU load error
kg Jul 15, 2020
279ec28
Store asset URLs into loaded_files instead of names
kg Jul 15, 2020
23ea27c
Address feedback
EgorBo Jul 15, 2020
cafd0f2
Update src/libraries/Common/src/Interop/Interop.TimeZoneInfo.Browser.cs
lewing Jul 16, 2020
c95ad39
Merge remote-tracking branch 'upstream/master' into icu-loader
kg Jul 16, 2020
3eaa5fb
Revert sample changes
kg Jul 16, 2020
794e290
Update src/libraries/Native/Unix/System.Globalization.Native/pal_icus…
kg Jul 16, 2020
34867d7
enable NativeCalendarName and RegionInfo.NativeName tests for wasm
EgorBo Jul 16, 2020
fe0e686
Update Version.Details.xml
EgorBo Jul 16, 2020
9b20a78
bump ICU
EgorBo Jul 16, 2020
49097be
Address feedback
EgorBo Jul 16, 2020
adc967e
Update Interop.TimeZoneInfo.Browser.cs
EgorBo Jul 16, 2020
6cf61e0
Address feedback
EgorBo Jul 16, 2020
eff92b4
Address feedback
EgorBo Jul 16, 2020
7a1a28e
ignore Interop.TimeZoneInfo on wasm
EgorBo Jul 16, 2020
d64d256
Address feedback
EgorBo Jul 16, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions eng/Version.Details.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
<Uri>https://github.com/dotnet/standard</Uri>
<Sha>cfe95a23647c7de1fe1a349343115bd7720d6949</Sha>
</Dependency>
<Dependency Name="Microsoft.NETCore.Runtime.ICU.Transport" Version="5.0.0-preview.8.20364.1">
<Dependency Name="Microsoft.NETCore.Runtime.ICU.Transport" Version="5.0.0-preview.8.20365.1">
<Uri>https://github.com/dotnet/icu</Uri>
<Sha>bf5a3a643815a8a46693d618d08dbc96f353ca9e</Sha>
<Sha>7247fa0d9e8faee2cceee6f04856b2c447f41bca</Sha>
</Dependency>
</ProductDependencies>
<ToolsetDependencies>
Expand Down
2 changes: 1 addition & 1 deletion eng/Versions.props
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@
<!-- ILLink -->
<MicrosoftNETILLinkTasksVersion>5.0.0-preview.3.20363.5</MicrosoftNETILLinkTasksVersion>
<!-- ICU -->
<MicrosoftNETCoreRuntimeICUTransportVersion>5.0.0-preview.8.20364.1</MicrosoftNETCoreRuntimeICUTransportVersion>
<MicrosoftNETCoreRuntimeICUTransportVersion>5.0.0-preview.8.20365.1</MicrosoftNETCoreRuntimeICUTransportVersion>
<!-- Mono LLVM -->
<runtimelinuxarm64MicrosoftNETCoreRuntimeMonoLLVMSdkVersion>9.0.1-alpha.1.20356.1</runtimelinuxarm64MicrosoftNETCoreRuntimeMonoLLVMSdkVersion>
<runtimelinuxarm64MicrosoftNETCoreRuntimeMonoLLVMToolsVersion>9.0.1-alpha.1.20356.1</runtimelinuxarm64MicrosoftNETCoreRuntimeMonoLLVMToolsVersion>
Expand Down
3 changes: 2 additions & 1 deletion eng/liveBuilds.targets
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,8 @@
Include="
$(LibrariesNativeArtifactsPath)dotnet.js;
$(LibrariesNativeArtifactsPath)dotnet.wasm;
$(LibrariesNativeArtifactsPath)dotnet.timezones.blat;"
$(LibrariesNativeArtifactsPath)dotnet.timezones.blat;
$(LibrariesNativeArtifactsPath)icudt.dat;"
IsNative="true" />
</ItemGroup>

Expand Down
12 changes: 9 additions & 3 deletions eng/testing/tests.mobile.targets
Original file line number Diff line number Diff line change
Expand Up @@ -121,10 +121,17 @@
AssemblyFile="$(WasmAppBuilderTasksAssemblyPath)" />

<Target Condition="'$(TargetOS)' == 'Browser'" Name="BundleTestWasmApp">
<ItemGroup>
<WasmSatelliteAssemblies Include="$(PublishDir)*\*.resources.dll" />
<WasmSatelliteAssemblies>
<CultureName>$([System.IO.Directory]::GetParent('%(Identity)').Name)</CultureName>
</WasmSatelliteAssemblies>
</ItemGroup>
<ItemGroup>
<AssemblySearchPaths Include="$(PublishDir)"/>
<WasmFilesToIncludeInFileSystem Include="@(ContentWithTargetPath)" />
<WasmFilesToIncludeInFileSystem Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.BuildReference)' == 'true'" />
<WasmFilesToIncludeInFileSystem Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.BuildReference)' == 'true' and !$([System.String]::new('%(ReferenceCopyLocalPaths.Identity)').EndsWith('.resources.dll'))" />
<WasmFilesToIncludeInFileSystem Include="@(WasmSatelliteAssemblies)" TargetPath="%(WasmSatelliteAssemblies.CultureName)\%(WasmSatelliteAssemblies.Filename)%(WasmSatelliteAssemblies.Extension)" />
<ExtraAssemblies Include="$(PublishDir)$(AssemblyName).dll" />
<!-- we need to preserve these facades for BinaryFormatter tests -->
<ExtraAssemblies Include="$(PublishDir)mscorlib.dll" />
Expand All @@ -140,7 +147,6 @@
<ExtraAssemblies Include="$(PublishDir)System.Xml.dll" />
<ExtraAssemblies Include="$(PublishDir)WindowsBase.dll" />
</ItemGroup>

<Error Condition="!Exists('$(MicrosoftNetCoreAppRuntimePackRidDir)')" Text="MicrosoftNetCoreAppRuntimePackRidDir=$(MicrosoftNetCoreAppRuntimePackRidDir) doesn't exist" />
<WasmAppBuilder
AppDir="$(BundleDir)"
Expand All @@ -149,7 +155,7 @@
MainJS="$(MonoProjectRoot)\wasm\runtime-test.js"
ExtraAssemblies="@(ExtraAssemblies)"
FilesToIncludeInFileSystem="@(WasmFilesToIncludeInFileSystem)"
AssemblySearchPaths="@(AssemblySearchPaths)" />
AssemblySearchPaths="@(AssemblySearchPaths)"/>
</Target>

<Target Name="AddTestRunnersToPublishedFiles"
Expand Down
11 changes: 9 additions & 2 deletions src/libraries/Common/src/Interop/Interop.Calendar.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ internal static partial class Interop
{
internal static partial class Globalization
{
internal delegate void EnumCalendarInfoCallback(
[MarshalAs(UnmanagedType.LPWStr)] string calendarString,
internal unsafe delegate void EnumCalendarInfoCallback(
char* calendarString,
IntPtr context);

[DllImport(Libraries.GlobalizationNative, CharSet = CharSet.Unicode, EntryPoint = "GlobalizationNative_GetCalendars")]
Expand All @@ -19,8 +19,15 @@ internal delegate void EnumCalendarInfoCallback(
[DllImport(Libraries.GlobalizationNative, CharSet = CharSet.Unicode, EntryPoint = "GlobalizationNative_GetCalendarInfo")]
internal static extern unsafe ResultCode GetCalendarInfo(string localeName, CalendarId calendarId, CalendarDataType calendarDataType, char* result, int resultCapacity);

#if TARGET_BROWSER
// Temp workaround for pinvoke callbacks for Mono-Wasm-Interpreter
// https://github.com/dotnet/runtime/issues/39100
[DllImport(Libraries.GlobalizationNative, CharSet = CharSet.Unicode, EntryPoint = "GlobalizationNative_EnumCalendarInfo")]
internal static extern bool EnumCalendarInfo(IntPtr callback, string localeName, CalendarId calendarId, CalendarDataType calendarDataType, IntPtr context);
#else
[DllImport(Libraries.GlobalizationNative, CharSet = CharSet.Unicode, EntryPoint = "GlobalizationNative_EnumCalendarInfo")]
internal static extern bool EnumCalendarInfo(EnumCalendarInfoCallback callback, string localeName, CalendarId calendarId, CalendarDataType calendarDataType, IntPtr context);
#endif

[DllImport(Libraries.GlobalizationNative, EntryPoint = "GlobalizationNative_GetLatestJapaneseEra")]
internal static extern int GetLatestJapaneseEra();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

internal static partial class Interop
{
internal static partial class Globalization
{
// needs to be kept in sync with TimeZoneDisplayNameType in System.Globalization.Native
internal enum TimeZoneDisplayNameType
{
Generic = 0,
Standard = 1,
DaylightSavings = 2,
}
}
}
8 changes: 0 additions & 8 deletions src/libraries/Common/src/Interop/Interop.TimeZoneInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,6 @@ internal static partial class Interop
{
internal static partial class Globalization
{
// needs to be kept in sync with TimeZoneDisplayNameType in System.Globalization.Native
internal enum TimeZoneDisplayNameType
{
Generic = 0,
Standard = 1,
DaylightSavings = 2,
}

[DllImport(Libraries.GlobalizationNative, CharSet = CharSet.Unicode, EntryPoint = "GlobalizationNative_GetTimeZoneDisplayName")]
internal static extern unsafe ResultCode GetTimeZoneDisplayName(
string localeName,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@

// All ICU headers need to be included here so that all function prototypes are
// available before the function pointers are declared below.
#include <unicode/uclean.h>
#include <unicode/ucurr.h>
#include <unicode/ucal.h>
#include <unicode/uchar.h>
#include <unicode/ucol.h>
#include <unicode/udat.h>
#include <unicode/udata.h>
#include <unicode/udatpg.h>
#include <unicode/uenum.h>
#include <unicode/uidna.h>
Expand Down Expand Up @@ -55,6 +57,7 @@

#include "pal_compiler.h"

#if !defined(STATIC_ICU)
// List of all functions from the ICU libraries that are used in the System.Globalization.Native.so
#define FOR_ALL_UNCONDITIONAL_ICU_FUNCTIONS \
PER_FUNCTION_BLOCK(u_charsToUChars, libicuuc) \
Expand Down Expand Up @@ -279,3 +282,5 @@ FOR_ALL_ICU_FUNCTIONS
#define usearch_getMatchedLength(...) usearch_getMatchedLength_ptr(__VA_ARGS__)
#define usearch_last(...) usearch_last_ptr(__VA_ARGS__)
#define usearch_openFromCollator(...) usearch_openFromCollator_ptr(__VA_ARGS__)

#endif // !defined(STATIC_ICU)
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
//

#include <stdlib.h>
#include <stdio.h>
#include "pal_icushim_internal.h"
#include "pal_icushim.h"
#include <unicode/putil.h>
#include <unicode/uversion.h>
#include <unicode/localpointer.h>
#include <unicode/utrace.h>

static void log_icu_error(const char* name, UErrorCode status)
{
const char * statusText = u_errorName(status);
fprintf(stderr, "ICU call %s failed with error #%d '%s'.\n", name, status, statusText);
}

static void U_CALLCONV icu_trace_data(const void* context, int32_t fnNumber, int32_t level, const char* fmt, va_list args)
{
char buf[1000];
utrace_vformat(buf, sizeof(buf), 0, fmt, args);
printf("[ICUDT] %s: %s\n", utrace_functionName(fnNumber), buf);
}

#ifdef __EMSCRIPTEN__
#include <emscripten.h>

EMSCRIPTEN_KEEPALIVE int32_t mono_wasm_load_icu_data(void * pData);

EMSCRIPTEN_KEEPALIVE int32_t mono_wasm_load_icu_data(void * pData)
{
UErrorCode status = 0;
udata_setCommonData(pData, &status);

if (U_FAILURE(status)) {
log_icu_error("udata_setCommonData", status);
return 0;
} else {
//// Uncomment to enable ICU tracing,
//// see https://github.com/unicode-org/icu/blob/master/docs/userguide/icu_data/tracing.md
// utrace_setFunctions(0, 0, 0, icu_trace_data);
// utrace_setLevel(UTRACE_VERBOSE);
return 1;
}
}
#endif

int32_t GlobalizationNative_LoadICU(void)
{
const char* icudir = getenv("DOTNET_ICU_DIR");
if (icudir)
u_setDataDirectory(icudir);
else
; // default ICU search path behavior will be used, see http://userguide.icu-project.org/icudata

UErrorCode status = 0;
UVersionInfo version;
// Request the CLDR version to perform basic ICU initialization and find out
// whether it worked.
ulocdata_getCLDRVersion(version, &status);

if (U_FAILURE(status)) {
log_icu_error("ulocdata_getCLDRVersion", status);
return 0;
}

return 1;
}

void GlobalizationNative_InitICUFunctions(void* icuuc, void* icuin, const char* version, const char* suffix)
{
// no-op for static
}

int32_t GlobalizationNative_GetICUVersion(void)
{
UVersionInfo versionInfo;
u_getVersion(versionInfo);

return (versionInfo[0] << 24) + (versionInfo[1] << 16) + (versionInfo[2] << 8) + versionInfo[3];
}
1 change: 1 addition & 0 deletions src/libraries/Native/native-binplace.proj
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
<BinPlaceItem Condition="'$(TargetOS)' == 'Browser'" Include="$(NativeBinDir)dotnet.js" />
<BinPlaceItem Condition="'$(TargetOS)' == 'Browser'" Include="$(NativeBinDir)dotnet.wasm" />
<BinPlaceItem Condition="'$(TargetOS)' == 'Browser'" Include="$(NativeBinDir)dotnet.timezones.blat" />
<BinPlaceItem Condition="'$(TargetOS)' == 'Browser'" Include="$(NativeBinDir)icudt.dat" />
<FileWrites Include="@(BinPlaceItem)" />
</ItemGroup>
</Target>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ namespace System.Globalization.Tests
public class TaiwanCalendarDaysAndMonths
{
[Fact]
[ActiveIssue("https://github.com/dotnet/runtime/issues/39285", TestPlatforms.Browser)]
public void DayNames_MonthNames()
{
string[] expectedDayNames =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,16 @@ public static IEnumerable<object[]> CalendarWeekRule_Get_TestData()
{
yield return new object[] { DateTimeFormatInfo.InvariantInfo, CalendarWeekRule.FirstDay };
yield return new object[] { new CultureInfo("en-US").DateTimeFormat, CalendarWeekRule.FirstDay };
yield return new object[] { new CultureInfo("br-FR").DateTimeFormat, DateTimeFormatInfoData.BrFRCalendarWeekRule() };

if (PlatformDetection.IsNotBrowser)
{
yield return new object[] { new CultureInfo("br-FR").DateTimeFormat, DateTimeFormatInfoData.BrFRCalendarWeekRule() };
}
else
{
// "br-FR" is not presented in Browser's ICU. Let's test ru-RU instead.
yield return new object[] { new CultureInfo("ru-RU").DateTimeFormat, CalendarWeekRule.FirstFourDayWeek };
}
}

[Theory]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public static IEnumerable<object[]> CurrencyGroupSizes_TestData()
yield return new object[] { NumberFormatInfo.InvariantInfo, new int[] { 3 } };
yield return new object[] { CultureInfo.GetCultureInfo("en-US").NumberFormat, new int[] { 3 } };

if (!PlatformDetection.IsUbuntu && !PlatformDetection.IsWindows7 && !PlatformDetection.IsWindows8x && !PlatformDetection.IsFedora)
if (PlatformDetection.IsNotBrowser && !PlatformDetection.IsUbuntu && !PlatformDetection.IsWindows7 && !PlatformDetection.IsWindows8x && !PlatformDetection.IsFedora)
{
yield return new object[] { CultureInfo.GetCultureInfo("ur-IN").NumberFormat, new int[] { 3, 2 } };
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,24 @@ public void CurrencyNegativePattern_Get_ReturnsExpected(NumberFormatInfo format,
Assert.Contains(format.CurrencyNegativePattern, acceptablePatterns);
}

public static IEnumerable<object[]> CurrencyNegativePatternTestLocales()
{
yield return new object[] { "en-US" };
yield return new object[] { "en-CA" };
yield return new object[] { "fa-IR" };
yield return new object[] { "fr-CD" };
yield return new object[] { "fr-CA" };

if (PlatformDetection.IsNotBrowser)
{
// Browser's ICU doesn't contain these locales
yield return new object[] { "as" };
yield return new object[] { "es-BO" };
}
}

[Theory]
[InlineData("en-US")]
[InlineData("en-CA")]
[InlineData("fa-IR")]
[InlineData("fr-CD")]
[InlineData("as")]
[InlineData("es-BO")]
[InlineData("fr-CA")]
[MemberData(nameof(CurrencyNegativePatternTestLocales))]
public void CurrencyNegativePattern_Get_ReturnsExpected_ByLocale(string locale)
{
CultureInfo culture;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,19 @@ public static IEnumerable<object[]> ToLower_TestData_netcore()
}
}

public static IEnumerable<string> GetTestLocales()
{
yield return "tr";
yield return "tr-TR";

if (PlatformDetection.IsNotBrowser)
{
// Browser's ICU doesn't contain these locales
yield return "az";
yield return "az-Latn-AZ";
}
}

public static IEnumerable<object[]> ToLower_TestData()
{
foreach (string cultureName in s_cultureNames)
Expand Down Expand Up @@ -226,7 +239,7 @@ public static IEnumerable<object[]> ToLower_TestData()
yield return new object[] { cultureName, "\u03A3", "\u03C3" };
}

foreach (string cultureName in new string[] { "tr", "tr-TR", "az", "az-Latn-AZ" })
foreach (string cultureName in GetTestLocales())
{
yield return new object[] { cultureName, "\u0130", "i" };
yield return new object[] { cultureName, "i", "i" };
Expand Down Expand Up @@ -349,7 +362,7 @@ public static IEnumerable<object[]> ToUpper_TestData()
}

// Turkish i
foreach (string cultureName in new string[] { "tr", "tr-TR", "az", "az-Latn-AZ" })
foreach (string cultureName in GetTestLocales())
{
yield return new object[] { cultureName, "i", "\u0130" };
yield return new object[] { cultureName, "\u0130", "\u0130" };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1071,7 +1071,10 @@
<Compile Include="$(CommonPath)Interop\Interop.ResultCode.cs">
<Link>Common\Interop\Interop.ResultCode.cs</Link>
</Compile>
<Compile Include="$(CommonPath)Interop\Interop.TimeZoneInfo.cs">
<Compile Include="$(CommonPath)Interop\Interop.TimeZoneDisplayNameType.cs">
<Link>Common\Interop\Interop.TimeZoneDisplayNameType.cs</Link>
</Compile>
<Compile Include="$(CommonPath)Interop\Interop.TimeZoneInfo.cs" Condition="'$(TargetsBrowser)' != 'true'">
<Link>Common\Interop\Interop.TimeZoneInfo.cs</Link>
</Compile>
<Compile Include="$(CommonPath)Interop\Interop.Utils.cs">
Expand Down Expand Up @@ -1824,9 +1827,11 @@
</ItemGroup>
<ItemGroup Condition="'$(TargetsUnix)' == 'true'">
<Compile Include="$(MSBuildThisFileDirectory)System\Environment.Unix.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\TimeZoneInfo.GetDisplayName.cs" />
</ItemGroup>
<ItemGroup Condition="'$(TargetsBrowser)' == 'true'">
<Compile Include="$(MSBuildThisFileDirectory)System\Environment.Browser.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\TimeZoneInfo.GetDisplayName.Invariant.cs" />
</ItemGroup>
<ItemGroup Condition="'$(IsOSXLike)' == 'true'">
<Compile Include="$(CommonPath)Interop\OSX\Interop.libobjc.cs">
Expand Down
Loading