Я просто наткнулся на похожую проблему и хочу оставить это здесь
Прежде всего, вы можете указать AssemblyName в строке
var type = System.Type.GetType("Foo.Bar.Xyz, Assembly.Name");
Однако это работает только для сборок без строгого имени. Объяснение уже есть в ответе Саймонса If the assembly has a strong name, a complete assembly name is required.
Моя проблема заключалась в том, что мне пришлось разрешить System.Dictionary<?,?>
из строки во время выполнения. Для Dictionary<int, string>
это может быть легко, но как насчет Dictionary<int, Image>
?
это приведет к
var typeName = "System.Collections.Generic.Dictionary`2[System.Int32, [System.Drawing.Image, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]]";
Но я не хочу писать строгое имя. Особенно потому, что я не хочу включать версии, так как я планирую ориентироваться на несколько фреймворков с моим кодом.
Так вот мое решение
privat statice void Main()
{
var typeName = "System.Collections.Generic.Dictionary`2[System.Int32, [System.Drawing.Image, System.Drawing]]";
var type = Type.GetType(typeName, ResolveAssembly, ResolveType);
}
private static Assembly ResolveAssembly(AssemblyName assemblyName)
{
if (assemblyName.Name.Equals(assemblyName.FullName))
return Assembly.LoadWithPartialName(assemblyName.Name);
return Assembly.Load(assemblyName);
}
private static Type ResolveType(Assembly assembly, string typeName, bool ignoreCase)
{
return assembly != null
? assembly.GetType(typeName, false, ignoreCase)
: Type.GetType(typeName, false, ignoreCase);
}
Type.GetType(...)
имеет перегрузку, которая принимает функцию для сборки и определения типа, что в аккуратном виде. Assembly.LoadWithPartialName
устарело, но если оно будет удалено в будущем, я мог бы подумать о замене (перебрать все сборки в текущем домене приложения и сравнить частичные имена).