mddocs
mddocs copied to clipboard
Mono.Cecil.AssemblyResolutionException
I could not find subj issue description anywhere. Placing my investigation here. I hope you will be able to find permanent solution.
All dependencies should be in the execution or bin folder ('.' or 'bin') according to Mono.Cecil assembly resolution logic.
protected BaseAssemblyResolver()
{
directories = new Collection<string>(2) { ".", "bin" };
}
public virtual AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters)
{
Mixin.CheckName(name);
Mixin.CheckParameters(parameters);
AssemblyDefinition assemblyDefinition = SearchDirectory(name, directories, parameters);
if (assemblyDefinition != null)
{
return assemblyDefinition;
}
if (name.IsRetargetable)
{
name = new AssemblyNameReference(name.Name, Mixin.ZeroVersion)
{
PublicKeyToken = Empty<byte>.Array
};
}
assemblyDefinition = SearchTrustedPlatformAssemblies(name, parameters);
if (assemblyDefinition != null)
{
return assemblyDefinition;
}
if (this.ResolveFailure != null)
{
assemblyDefinition = this.ResolveFailure(this, name);
if (assemblyDefinition != null)
{
return assemblyDefinition;
}
}
throw new AssemblyResolutionException(name);
}
protected virtual AssemblyDefinition SearchDirectory(AssemblyNameReference name, global::System.Collections.Generic.IEnumerable<string> directories, ReaderParameters parameters)
{
string[] array = ((!name.IsWindowsRuntime) ? new string[2] { ".exe", ".dll" } : new string[2] { ".winmd", ".dll" });
global::System.Collections.Generic.IEnumerator<string> enumerator = directories.GetEnumerator();
try
{
while (((global::System.Collections.IEnumerator)enumerator).MoveNext())
{
string current = enumerator.get_Current();
string[] array2 = array;
foreach (string text in array2)
{
string text2 = Path.Combine(current, name.Name + text);
if (File.Exists(text2))
{
try
{
return GetAssembly(text2, parameters);
}
catch (BadImageFormatException)
{
}
}
}
}
}
finally
{
((global::System.IDisposable)enumerator)?.Dispose();
}
return null;
}
There is workaround: build self-contained assembly (flag '-r').