26using System.Collections.Generic;
27using System.Diagnostics;
28using System.Threading;
29using System.Runtime.Serialization;
36#if IMPORTER || EXPORTER
41using System.Reflection;
59 AssemblyLoader assemblyLoader;
61 RuntimeAssemblyClassLoader[] delegates;
62#if !IMPORTER && !EXPORTER && !FIRST_PASS
63 JavaClassLoaderConstructionInProgress jclcip;
64 java.security.ProtectionDomain protectionDomain;
65 byte hasCustomClassLoader;
67 Dictionary<int, List<int>> exports;
68 string[] exportedAssemblyNames;
69 AssemblyLoader[] exportedAssemblies;
70 Dictionary<Assembly, AssemblyLoader> exportedLoaders;
75 sealed class AssemblyLoader
78 readonly RuntimeAssemblyClassLoader loader;
83 Dictionary<string, string> nameMap;
87#if !IMPORTER && !EXPORTER && !FIRST_PASS
88 sun.misc.URLClassPath urlClassPath;
96 internal AssemblyLoader(RuntimeAssemblyClassLoader loader,
Assembly assembly)
98 this.loader = loader ??
throw new ArgumentNullException(nameof(loader));
99 this.assembly = assembly ??
throw new ArgumentNullException(nameof(assembly));
101 modules = assembly.GetModules(
false);
102 isJavaModule =
new bool[modules.Length];
104 for (
int i = 0; i < modules.Length; i++)
106 var attr = loader.Context.AttributeHelper.GetJavaModuleAttributes(modules[i]);
109 isJavaModule[i] =
true;
117 nameMap =
new Dictionary<string, string>();
119 for (
int j = 0; j < map.Length; j += 2)
122 var val = map[j + 1];
126 nameMap.Add(key, val);
139 var newList =
new string[jarList.Length + jars.Length];
140 Array.Copy(jarList, newList, jarList.Length);
141 Array.Copy(jars, 0, newList, jarList.Length, jars.Length);
149 hasDotNetModule =
true;
156 get {
return assembly; }
159 internal bool HasJavaModule
163 for (
int i = 0; i < isJavaModule.Length; i++)
176 Type GetType(
string name)
180 return assembly.GetType(name);
182 catch (ArgumentException)
186 catch (FileLoadException e)
192 loader.Diagnostics.GenericRuntimeInfo(e.Message);
208 return module.GetType(name);
210 catch (ArgumentException)
214 catch (FileLoadException e)
220 loader.Diagnostics.GenericRuntimeInfo(e.Message);
232 nameMap.TryGetValue(name, out n);
234 var t = GetType(module, n ?? name);
237 n = name.Replace(
'$',
'+');
238 if (!ReferenceEquals(n, name))
243 && !loader.Context.AttributeHelper.IsHideFromJava(t)
249 catch (ArgumentException x)
253 loader.Diagnostics.GenericRuntimeInfo(x.Message);
259 internal RuntimeJavaType DoLoad(
string name)
261 for (
int i = 0; i < modules.Length; i++)
265 var type = GetJavaType(modules[i], name);
271 return loader.Context.ManagedByteCodeJavaTypeFactory.newInstance(name, type);
281 if (type !=
null && type.Assembly != assembly)
301 RuntimeJavaType outer =
null;
312 outer = DoLoad(name.Substring(0, name.Length -
RuntimeManagedJavaType.AttributeAnnotationReturnValueSuffix.Length));
316 outer = DoLoad(name.Substring(0, name.Length -
RuntimeManagedJavaType.AttributeAnnotationMultipleSuffix.Length));
323 if (outer !=
null && outer.IsFakeTypeContainer)
324 foreach (var tw
in outer.InnerClasses)
341 var module = type.Module;
342 int moduleIndex = -1;
343 for (
int i = 0; i < modules.Length; i++)
345 if (modules[i] == module)
353 if (isJavaModule[moduleIndex])
358 if (loader.Context.AttributeHelper.IsHideFromJava(type))
375 internal RuntimeJavaType CreateJavaTypeForAssemblyType(
Type type)
377 var name = GetTypeNameAndType(type, out
bool isJavaType);
384 return loader.Context.ManagedByteCodeJavaTypeFactory.newInstance(name, type);
395 internal bool InternalsVisibleTo(
AssemblyName otherName)
397 if (internalsVisibleTo ==
null)
398 Interlocked.CompareExchange(
ref internalsVisibleTo, loader.Context.AttributeHelper.GetInternalsVisibleToAttributes(assembly),
null);
400 foreach (var name
in internalsVisibleTo)
404 if (
ReflectUtil.MatchNameAndPublicKeyToken(name, otherName))
413#if !IMPORTER && !EXPORTER && !FIRST_PASS
415 internal java.util.Enumeration FindResources(
string name)
417 if (urlClassPath ==
null)
420 return global::java.util.Collections.emptyEnumeration();
422 var urls =
new List<
java.net.URL>();
423 foreach (var jar
in jarList)
424 urls.Add(MakeResourceURL(assembly, jar));
426 Interlocked.CompareExchange(
ref urlClassPath,
new sun.misc.URLClassPath(urls.ToArray()),
null);
429 return urlClassPath.findResources(name,
true);
441 this(context, assembly, null)
452 internal RuntimeAssemblyClassLoader(
RuntimeContext context,
Assembly assembly,
string[] fixedReferences) :
455 this.assemblyLoader =
new AssemblyLoader(
this, assembly);
456 this.references = fixedReferences;
463 if (assembly.GetManifestResourceInfo(
"ikvm.exports") !=
null)
465 using (Stream stream = assembly.GetManifestResourceStream(
"ikvm.exports"))
467 var rdr =
new BinaryReader(stream);
468 var assemblyCount = rdr.ReadInt32();
469 for (
int i = 0; i < assemblyCount; i++)
471 var assemblyName = rdr.ReadString();
472 var typeCount = rdr.ReadInt32();
475 for (
int j = 0; j < typeCount; j++)
480 compiler.LoadFile(Path.Combine(Path.GetDirectoryName(assembly.Location),
new AssemblyName(assemblyName).
Name +
".dll"));
494 void DoInitializeExports()
498 if (delegates ==
null)
500 if (
ReflectUtil.IsDynamicAssembly(assemblyLoader.Assembly) ==
false && assemblyLoader.Assembly.GetManifestResourceInfo(
"ikvm.exports") !=
null)
502 var wildcardExports =
new List<string>();
504 using (var stream = assemblyLoader.Assembly.GetManifestResourceStream(
"ikvm.exports"))
506 var rdr =
new BinaryReader(stream);
507 var assemblyCount = rdr.ReadInt32();
508 exports =
new Dictionary<int, List<int>>();
509 exportedAssemblies =
new AssemblyLoader[assemblyCount];
510 exportedAssemblyNames =
new string[assemblyCount];
511 exportedLoaders =
new Dictionary<Assembly, AssemblyLoader>();
513 for (
int i = 0; i < assemblyCount; i++)
515 exportedAssemblyNames[i] =
string.Intern(rdr.ReadString());
517 int typeCount = rdr.ReadInt32();
518 if (typeCount == 0 && references ==
null)
519 wildcardExports.Add(exportedAssemblyNames[i]);
521 for (
int j = 0; j < typeCount; j++)
523 int hash = rdr.ReadInt32();
524 if (exports.TryGetValue(hash, out List<int> assemblies) ==
false)
526 assemblies =
new List<int>();
527 exports.Add(hash, assemblies);
535 references ??= wildcardExports.ToArray();
539 var refNames = assemblyLoader.Assembly.GetReferencedAssemblies();
540 references =
new string[refNames.Length];
541 for (
int i = 0; i < references.Length; i++)
542 references[i] = refNames[i].FullName;
545 Interlocked.Exchange(
ref delegates,
new RuntimeAssemblyClassLoader[references.Length]);
550 void LazyInitExports()
552 if (delegates ==
null)
553 DoInitializeExports();
556 internal Assembly MainAssembly => assemblyLoader.Assembly;
558 internal Assembly GetAssembly(RuntimeJavaType wrapper)
560 Debug.Assert(wrapper.ClassLoader ==
this);
562 while (wrapper.IsFakeNestedType)
563 wrapper = wrapper.DeclaringTypeWrapper;
565 return wrapper.TypeAsBaseType.Assembly;
568 Assembly LoadAssemblyOrClearName(
ref string name,
bool exported)
587 internal RuntimeJavaType DoLoad(
string name)
589 var tw = assemblyLoader.DoLoad(name);
591 return RegisterInitiatingLoader(tw);
595 if (exports !=
null && exports.TryGetValue(
JVM.PersistableHash(name), out var assemblies))
597 foreach (
int index
in assemblies)
599 var loader = TryGetLoaderByIndex(index);
602 tw = loader.DoLoad(name);
604 return RegisterInitiatingLoader(tw);
614 return GetLoader(type.Assembly).GetTypeNameAndType(type, out isJavaType);
617 AssemblyLoader TryGetLoaderByIndex(
int index)
619 var loader = exportedAssemblies[index];
622 var
asm = LoadAssemblyOrClearName(
ref exportedAssemblyNames[index],
true);
624 loader = exportedAssemblies[index] = GetLoaderForExportedAssembly(
asm);
630 internal List<Assembly> GetAllAvailableAssemblies()
632 var list =
new List<Assembly>();
633 list.Add(assemblyLoader.Assembly);
637 if (exportedAssemblies !=
null)
639 for (
int i = 0; i < exportedAssemblies.Length; i++)
641 var loader = TryGetLoaderByIndex(i);
643 list.Add(loader.Assembly);
650 AssemblyLoader GetLoader(
Assembly assembly)
652 if (assemblyLoader.Assembly == assembly)
653 return assemblyLoader;
655 return GetLoaderForExportedAssembly(assembly);
658 AssemblyLoader GetLoaderForExportedAssembly(
Assembly assembly)
662 AssemblyLoader loader;
663 lock (exportedLoaders)
664 exportedLoaders.TryGetValue(assembly, out loader);
668 loader =
new AssemblyLoader(
this, assembly);
670 lock (exportedLoaders)
672 if (exportedLoaders.TryGetValue(assembly, out AssemblyLoader existing))
679 exportedLoaders.Add(assembly, loader);
693 internal virtual RuntimeJavaType GetJavaTypeFromAssemblyType(
Type type)
695 if (type.Name.EndsWith(
"[]"))
700 var javaType = GetLoader(type.Assembly).CreateJavaTypeForAssemblyType(type);
701 if (javaType !=
null)
703 if (type.IsGenericType && !type.IsGenericTypeDefinition)
707 javaType = javaType.ClassLoader.RegisterInitiatingLoader(javaType);
711 javaType = RegisterInitiatingLoader(javaType);
715 if (javaType.TypeAsTBD != type && (!javaType.IsRemapped || javaType.TypeAsBaseType != type))
720 throw new InternalException($
"\nType \"{type.FullName}\" and \"{javaType.TypeAsTBD.FullName}\" both map to the same name \"{javaType.Name}\".");
730 protected override RuntimeJavaType LoadClassImpl(
string name,
LoadMode mode)
732 var tw = FindLoadedClass(name);
736#if !IMPORTER && !EXPORTER && !FIRST_PASS
738 while (hasCustomClassLoader != 2)
740 if (hasCustomClassLoader == 0)
742 var customClassLoader = GetCustomClassLoaderType();
743 if (customClassLoader ==
null)
745 hasCustomClassLoader = 2;
749 WaitInitializeJavaClassLoader(customClassLoader);
750 hasCustomClassLoader = 1;
752 return base.LoadClassImpl(name, mode);
757 return LoadBootstrapIfNonJavaAssembly(name)
759 ?? FindOrLoadGenericClass(name,
LoadMode.LoadOrNull);
768 internal RuntimeJavaType LoadClass(
string name)
770 return FindLoadedClass(name)
771 ?? LoadBootstrapIfNonJavaAssembly(name)
773 ?? FindOrLoadGenericClass(name,
LoadMode.LoadOrNull);
776 RuntimeJavaType LoadBootstrapIfNonJavaAssembly(
string name)
778 if (!assemblyLoader.HasJavaModule)
784 RuntimeJavaType LoadDynamic(
string name)
786#if !IMPORTER && !EXPORTER && !FIRST_PASS
787 var classFile = name.Replace(
'.',
'/') +
".class";
789 return res.Loader.DefineDynamic(name, res.URL);
790 foreach (var res
in FindDelegateResources(classFile))
791 return res.Loader.DefineDynamic(name, res.URL);
792 foreach (var url
in FindResources(classFile))
793 return DefineDynamic(name, url);
798#if !IMPORTER && !EXPORTER && !FIRST_PASS
800 RuntimeJavaType DefineDynamic(
string name,
java.net.URL url)
804 using (var inp = url.openStream())
806 buf =
new byte[inp.available()];
807 for (
int pos = 0; pos < buf.Length;)
809 int read = inp.read(buf, pos, buf.Length - pos);
819 var loader = GetJavaClassLoader();
820 lock (loader ==
null ?
this : loader.getClassLoadingLock(name))
823 var tw = FindLoadedClass(name);
832 RuntimeJavaType FindReferenced(
string name)
834 for (
int i = 0; i < delegates.Length; i++)
836 if (delegates[i] ==
null)
838 var
asm = LoadAssemblyOrClearName(
ref references[i],
false);
842 if (delegates[i] !=
null)
844 var tw = delegates[i].DoLoad(name);
846 return RegisterInitiatingLoader(tw);
853#if !IMPORTER && !EXPORTER
855 static java.net.URL MakeResourceURL(
Assembly asm,
string name)
858 throw new NotImplementedException();
860 return new java.io.File(Path.Combine(VfsTable.GetAssemblyResourcesPath(
JVM.Vfs.Context,
asm,
JVM.
Properties.HomePath), name)).toURI().toURL();
864 internal IEnumerable<
java.net.URL> FindResources(
string unmangledName)
867 throw new NotImplementedException();
870 if (assemblyLoader.Assembly.IsDynamic)
875 var urls = assemblyLoader.FindResources(unmangledName);
876 while (urls.hasMoreElements())
879 yield
return (
java.net.URL)urls.nextElement();
883 if (assemblyLoader.HasJavaModule ==
false)
886 if (unmangledName !=
"" && assemblyLoader.Assembly.GetManifestResourceInfo(unmangledName) !=
null)
889 yield
return MakeResourceURL(assemblyLoader.Assembly, unmangledName);
895 if (res.JavaName == unmangledName)
898 yield
return MakeResourceURL(assemblyLoader.Assembly, res.ResourceName);
904 var name =
JVM.MangleResourceName(unmangledName);
905 if (assemblyLoader.Assembly.GetManifestResourceInfo(name) !=
null)
908 yield
return MakeResourceURL(assemblyLoader.Assembly, name);
913 if (exports !=
null && exports.TryGetValue(
JVM.PersistableHash(unmangledName), out var assemblies))
915 foreach (
int index
in assemblies)
917 var loader = exportedAssemblies[index];
920 var
asm = LoadAssemblyOrClearName(
ref exportedAssemblyNames[index],
true);
924 loader = exportedAssemblies[index] = GetLoaderForExportedAssembly(
asm);
927 urls = loader.FindResources(unmangledName);
928 while (urls.hasMoreElements())
931 yield
return (
java.net.URL)urls.nextElement();
934 if (loader.Assembly.GetManifestResourceInfo(name) !=
null)
937 yield
return MakeResourceURL(loader.Assembly, name);
943 if (found ==
false && unmangledName.EndsWith(
".class", StringComparison.Ordinal) && unmangledName.IndexOf(
'.') == unmangledName.Length - 6)
945 var tw = FindLoadedClass(unmangledName.Substring(0, unmangledName.Length - 6).Replace(
'/',
'.'));
946 if (tw !=
null && tw.ClassLoader ==
this && !tw.IsArray && !tw.IsDynamic)
947 yield
return new java.io.File(Path.Combine(VfsTable.GetAssemblyClassesPath(
JVM.Vfs.Context, assemblyLoader.Assembly,
JVM.
Properties.HomePath), unmangledName)).toURI().toURL();
955 internal readonly java.net.URL URL;
956 internal readonly RuntimeAssemblyClassLoader Loader;
963 internal Resource(
java.net.URL url, RuntimeAssemblyClassLoader loader)
966 this.Loader = loader;
976 protected IEnumerable<Resource> FindDelegateResources(
string name)
980 for (
int i = 0; i < delegates.Length; i++)
982 if (delegates[i] ==
null)
984 var
asm = LoadAssemblyOrClearName(
ref references[i],
false);
990 foreach (
java.net.URL url in delegates[i].FindResources(name))
991 yield
return new Resource(url, delegates[i]);
1001 internal virtual IEnumerable<
java.net.URL> GetResources(
string name)
1006 foreach (var res
in FindDelegateResources(name))
1007 yield
return res.URL;
1009 foreach (var url
in FindResources(name))
1015#if !IMPORTER && !FIRST_PASS && !EXPORTER
1017 private sealed class JavaClassLoaderConstructionInProgress
1019 internal readonly Thread Thread = Thread.CurrentThread;
1020 internal java.lang.ClassLoader javaClassLoader;
1021 internal int recursion;
1024 private java.lang.ClassLoader WaitInitializeJavaClassLoader(
Type customClassLoader)
1026 Interlocked.CompareExchange(
ref jclcip,
new JavaClassLoaderConstructionInProgress(),
null);
1027 JavaClassLoaderConstructionInProgress curr = jclcip;
1030 if (curr.Thread == Thread.CurrentThread)
1032 if (curr.javaClassLoader !=
null)
1036 return curr.javaClassLoader;
1043 InitializeJavaClassLoader(curr, customClassLoader);
1051 if (--curr.recursion == 0)
1056 Monitor.PulseAll(
this);
1065 while (jclcip !=
null)
1075 internal override java.lang.ClassLoader GetJavaClassLoader()
1077 return javaClassLoader ?? WaitInitializeJavaClassLoader(GetCustomClassLoaderType());
1080 internal virtual java.security.ProtectionDomain GetProtectionDomain()
1082 if (protectionDomain ==
null)
1085 return protectionDomain;
1089 protected override RuntimeJavaType FindLoadedClassLazy(
string name)
1092 ?? FindReferenced(name)
1093 ?? FindOrLoadGenericClass(name,
LoadMode.Find);
1096 internal override bool InternalsVisibleToImpl(RuntimeJavaType wrapper, RuntimeJavaType
friend)
1098 var other =
friend.ClassLoader;
1101#if IMPORTER || EXPORTER
1106 return GetAssembly(wrapper).Equals(GetTypeWrapperFactory().ModuleBuilder.Assembly)
1107 || GetTypeWrapperFactory().HasInternalAccess;
1117 otherName = ccl.GetAssemblyName();
1119 RuntimeAssemblyClassLoader acl = other as RuntimeAssemblyClassLoader;
1124 otherName = acl.GetAssembly(
friend).GetName();
1126 return GetLoader(GetAssembly(wrapper)).InternalsVisibleTo(otherName);
1129 internal void AddDelegate(RuntimeAssemblyClassLoader acl)
1134 delegates =
ArrayUtil.Concat(delegates, acl);
1137#if !IMPORTER && !EXPORTER
1139 internal List<KeyValuePair<string, string[]>> GetPackageInfo()
1141 var list =
new List<KeyValuePair<string, string[]>>();
1142 foreach (var m
in assemblyLoader.Assembly.GetModules(
false))
1145 foreach (var p
in attr)
1146 list.Add(
new KeyValuePair<
string,
string[]>(p.jar, p.packages));
1154#if !IMPORTER && !FIRST_PASS && !EXPORTER
1156 Type GetCustomClassLoaderType()
1158 LoadCustomClassLoaderRedirects(
this);
1160 var assembly = assemblyLoader.Assembly;
1161 var assemblyName = assembly.FullName;
1172 if (assemblyName.StartsWith(
asm +
","))
1176 return Type.GetType(kv.Value,
true);
1180 Diagnostics.GenericRuntimeError($
"Unable to load custom class loader {kv.Value} specified in app.config for assembly {assembly}: {x}");
1188 if (attribs.Length == 1)
1194 void InitializeJavaClassLoader(JavaClassLoaderConstructionInProgress jclcip,
Type customClassLoaderClass)
1196 var assembly = assemblyLoader.Assembly;
1198 if (customClassLoaderClass !=
null)
1202 if (!customClassLoaderClass.IsPublic && !customClassLoaderClass.Assembly.Equals(assembly))
1203 throw new InternalException($
"Custom class loader type is not accessible: '{customClassLoaderClass}'.");
1205 var customClassLoaderCtor = customClassLoaderClass.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
null,
new Type[] { typeof(Assembly) },
null);
1206 if (customClassLoaderCtor ==
null)
1207 throw new InternalException($
"Custom class loader type has no empty constructor: '{customClassLoaderClass}'.");
1209 if (!customClassLoaderCtor.IsPublic && !customClassLoaderClass.Assembly.Equals(assembly))
1210 throw new InternalException($
"Custom class loader constructor is not accessible: '{customClassLoaderClass}'.");
1218 var newJavaClassLoader = (
java.
lang.ClassLoader)GetUninitializedObject(customClassLoaderClass);
1221 if (jclcip.javaClassLoader ==
null)
1223 jclcip.javaClassLoader = newJavaClassLoader;
1225 DoPrivileged(
new CustomClassLoaderCtorCaller(customClassLoaderCtor, jclcip.javaClassLoader, assembly));
1226 Diagnostics.GenericRuntimeInfo($
"Created custom assembly class loader {customClassLoaderClass.FullName} for assembly {assembly}");
1231 GC.SuppressFinalize(newJavaClassLoader);
1236 Diagnostics.GenericRuntimeError($
"Unable to create custom assembly class loader {customClassLoaderClass.FullName} for {assembly}: {x}");
1240 if (jclcip.javaClassLoader ==
null)
1242 jclcip.javaClassLoader =
new ikvm.runtime.AssemblyClassLoader();
1247 Thread.MemoryBarrier();
1253 [
System.Security.SecuritySafeCritical]
1254 static object GetUninitializedObject(
Type type)
1257 return FormatterServices.GetUninitializedObject(type);
1259 return RuntimeHelpers.GetUninitializedObject(type);
1267 var dict =
new Dictionary<string, string>();
1272 foreach (var key
in System.Configuration.ConfigurationManager.AppSettings.AllKeys)
1274 const string prefix =
"ikvm-classloader:";
1275 if (key.StartsWith(prefix))
1276 dict[key.Substring(prefix.Length)] =
System.Configuration.ConfigurationManager.AppSettings.Get(key);
1294 sealed class CustomClassLoaderCtorCaller :
java.security.PrivilegedAction
1298 readonly
object classLoader;
1309 this.ctor = ctor ??
throw new ArgumentNullException(nameof(ctor));
1310 this.classLoader = classLoader ??
throw new ArgumentNullException(nameof(classLoader));
1311 this.assembly = assembly ??
throw new ArgumentNullException(nameof(assembly));
1316 ctor.Invoke(classLoader,
new object[] { assembly });
System.Threading.Interlocked Interlocked
IKVM.Reflection.Module Module
IKVM.Reflection.Type Type
IKVM.Reflection.Assembly Assembly
IKVM.Reflection.AssemblyName AssemblyName
IKVM.Reflection.ConstructorInfo ConstructorInfo
global::java.lang.invoke.LambdaForm.Name Name
Marks an assembly such that it's types are considered to be loaded by the specified class loader type...
static global::java.lang.Class defineClass1(global::java.lang.ClassLoader self, string name, byte[] b, int off, int len, global::java.security.ProtectionDomain pd, string source)
Implements the native method 'defineClass1'.
Represents an internal error that occurred within IKVM.
Property values loaded into the JVM from various sources.
Main state of the running JVM.
RuntimeAssemblyClassLoader FromAssembly(Assembly assembly)
Obtains the RuntimeAssemblyClassLoader for the given Assembly. This method should not be used with dy...
void SetWrapperForClassLoader(java.lang.ClassLoader javaClassLoader, RuntimeClassLoader wrapper)
Runtime support for a class loader.
RuntimeContext Context
Gets a reference to the RuntimeContext that this RuntimeClassLoader is hosted within.
java.lang.ClassLoader javaClassLoader
virtual IDiagnosticHandler Diagnostics
Gets the IDiagnosticHandler events originated by this class loader should be sent to.
Maintains services relevant to an instane of the IKVM runtime.
RuntimeAssemblyClassLoaderFactory AssemblyClassLoaderFactory
Gets the RuntimeAssemblyClassLoaderFactory associated with this instance of the runtime.
ISymbolResolver Resolver
Gets the ISymbolResolver associated with this instance of the runtime.
RuntimeClassLoaderFactory ClassLoaderFactory
Gets the RuntimeClassLoaderFactory associated with this instance of the runtime.
Represents a runtime Java type derived from a .NET assembly which was the result of the IKVM compiler...
Implements a RuntimeJavaType that exposes existing managed .NET types not the result of static compil...
void GenericRuntimeError(string arg0)
The 'GenericRuntimeError' diagnostic.
static DiagnosticEvent AssemblyContainsDuplicateClassNames(string arg0, string arg1, string arg2, string arg3, Exception? exception=null, DiagnosticLocation location=default)
The 'AssemblyContainsDuplicateClassNames' diagnostic.
Provides methods to parse a Java class name.