Update IKVM sources
[mono.git] / mcs / class / IKVM.Reflection / Fusion.cs
index b18a8d10e5db4f6f386df9f3bf5afe2f8bd5a8ab..5a227f4b87c551890a6d221e1b200f6c40cd3184 100644 (file)
@@ -39,15 +39,27 @@ namespace IKVM.Reflection
 
        static class Fusion
        {
-               private static readonly bool UseNativeFusion = Environment.OSVersion.Platform == PlatformID.Win32NT && System.Type.GetType("Mono.Runtime") == null && Environment.GetEnvironmentVariable("IKVM_DISABLE_FUSION") == null;
+               private static readonly bool UseNativeFusion = GetUseNativeFusion();
+
+               private static bool GetUseNativeFusion()
+               {
+                       try
+                       {
+                               return Environment.OSVersion.Platform == PlatformID.Win32NT
+                                       && System.Type.GetType("Mono.Runtime") == null
+                                       && Environment.GetEnvironmentVariable("IKVM_DISABLE_FUSION") == null;
+                       }
+                       catch (System.Security.SecurityException)
+                       {
+                               return false;
+                       }
+               }
 
                internal static bool CompareAssemblyIdentity(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out AssemblyComparisonResult result)
                {
                        if (UseNativeFusion)
                        {
-                               bool equivalent;
-                               Marshal.ThrowExceptionForHR(CompareAssemblyIdentity(assemblyIdentity1, unified1, assemblyIdentity2, unified2, out equivalent, out result));
-                               return equivalent;
+                               return CompareAssemblyIdentityNative(assemblyIdentity1, unified1, assemblyIdentity2, unified2, out result);
                        }
                        else
                        {
@@ -55,6 +67,13 @@ namespace IKVM.Reflection
                        }
                }
 
+               private static bool CompareAssemblyIdentityNative(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out AssemblyComparisonResult result)
+               {
+                       bool equivalent;
+                       Marshal.ThrowExceptionForHR(CompareAssemblyIdentity(assemblyIdentity1, unified1, assemblyIdentity2, unified2, out equivalent, out result));
+                       return equivalent;
+               }
+
                [DllImport("fusion", CharSet = CharSet.Unicode)]
                private static extern int CompareAssemblyIdentity(string pwzAssemblyIdentity1, bool fUnified1, string pwzAssemblyIdentity2, bool fUnified2, out bool pfEquivalent, out AssemblyComparisonResult pResult);