У меня есть следующий класс в XmlSer.dll
namespace xmlser
{
public class XmlSer
{
public Type test(string s)
{
return Type.GetType(s);
}
//...other code
}
}
и следующий код в MyApp.exe, который связывает XmlSer.dll как ссылку
namespace MyApp
{
public class TestClass
{
public int f1 = 1;
public float f2 = 2.34f;
public double f3 = 3.14;
public string f4 = "ciao";
}
class MainClass
{
public static void Main(string[] args)
{
TestClass tc = new TestClass();
XmlSer ser = new XmlSer();
Console.WriteLine(ser.test("MyApp.TestClass")!=null);
}
}
Запуск MyApp.exe. Я получаю false, это означает, что экземпляр ser из XmlSer не может получить тип Testclass (результат равен null). Полагая класс XmlSer непосредственно в код MyApp.exe, я правильно получаю тип TestClass.
Проверяя в сети, я обнаружил, что проблема связана с сборками. Это означает, что сборка .exe не видна методу XmlSer.test, поэтому он не может разрешить тип TestClass.
Как я могу решить проблему maintaing XmlSer в XmlSer.dll и MyApp.MainClass в MyApp.exe?
Спасибо.
Алессандро
Поскольку эти два не находятся в одной и той же сборке, вероятно, вам нужно включить имя сборки в строку типа:
Console.WriteLine(ser.test("MyApp.TestClass, MyApp")!=null);
Если все, что вы хотите сделать, это сериализовать произвольные объекты, вы можете сделать следующее:
public static class Serialization
{
public static void Serialize(object o, Stream output)
{
var serializer = new XmlSerializer(o.GetType());
serializer.Serialize(output, o);
}
}
Не уверен, но, возможно, попробуйте ser.Test( "MyApp.TestClass, MyApp" )?
EDIT: Очевидно, MyApp не XmlSer
Я нашел окончательное решение. Я просто получаю вектор всех сборок, загруженных из приложения. Затем на каждой сборке я вызываю Type.GetType, пока не получу действительный тип. Таким образом, вы можете получить каждый тип, который загружается в ваше пространство процесса независимо от сборки.
Ниже приведен код функции.
public static Type GetGlobalType(string s)
{
Type t=null;
Assembly[] av = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly a in av)
{
t=Type.GetType(s + "," + a.GetName());
if (t != null)
break;
}
return t;
}
Приветствия:)
Алессандро