Использовать строку имени класса для нового класса - PullRequest
0 голосов
/ 16 апреля 2019

Я хочу использовать имя класса для нового класса

NameSpace равно Mcs.ControlMaster

Имя класса HostTransportCommand

после проверки некоторых сообщений здесь. Я использую Активатор

var msg = Activator.CreateInstance(Type.GetType("Mcs.ControlMaster.HostTransportCommand", true));

получил исключение

System.TypeLoadException
  HResult=0x80131522
  Message=Could not load type 'Mcs.ControlMaster.HostTransportCommand' from assembly 'Mcs.ControlMaster.UT, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
  Source=<Cannot evaluate the exception source>
  StackTrace:
<Cannot evaluate the exception stack trace>

ОК, сборка выполнения теперь Mcs.ControlMaster.UT, и этот класс находится в Mcs.ControlMaster. затем

string fileToLoad = @"Mcs.ControlMaster.exe";
AssemblyName assamblyName = AssemblyName.GetAssemblyName(fileToLoad);
// assamblyName={Mcs.ControlMaster, Version=3.0.19.320, Culture=neutral, PublicKeyToken=null}
AppDomain myDomain = AppDomain.CreateDomain("MyDomain");
//myDomain={System.Runtime.Remoting.Proxies.__TransparentProxy}
Assembly myAssambly = myDomain.Load(assamblyName);
//myAssambly={Mcs.ControlMaster, Version=3.0.19.320, Culture=neutral, PublicKeyToken=null}
var myFunc = myAssambly.CreateInstance("HostTransportCommand");
// myFunc = null

при использовании

Type.GetType("Mcs.ControlMaster.UT, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", true));

получит

System.IO.FileLoadException: "The given assembly name or codebase was invalid." 

определение HostTransportCommand

namespace Mcs.ControlMaster
{
    public class HostTransportCommand : JsonMessage

и определение JsonMessage

namespace Mcs.Message
{
  public class JsonMessage : IMcsMessage

namespace Mcs.Message
{
  public interface IMcsMessage

Как решить эту проблему 10

1 Ответ

0 голосов
/ 18 апреля 2019

Демонстрация исходного кода в моем Github (batressc)

Я создал 2 проекта (библиотеки классов фреймворка .net), используя ваши определения классов: Mcs.ControllerMaster и Mcs.Message.Я упоминаю Mcs.ControllerMaster внутри третьего проекта Msc.WindowsConsole (консольное приложение Windows).

В целях тестирования я добавил 2 свойства к HostTransportCommand:

public class HostTransportCommand : JsonMessage {
    public string PropertyOne { get; set; }
    public int PropertyTwo { get; set; }
}

Затем, в методе Main, я выполняю следующие шаги:

class Program {
    static void Main(string[] args) {
        // Getting current execution directory
        var currentExecutingPath = Assembly.GetExecutingAssembly().CodeBase;
        string dirtyDirectory = Path.GetDirectoryName(currentExecutingPath);
        string directory = dirtyDirectory.Replace(@"file:\", "");

        // Loading assembly in app context
        var externalAssembly = File.ReadAllBytes($"{directory}\\Mcs.ControlMaster.dll");
        AppDomain.CurrentDomain.Load(externalAssembly);

        // Now is loading. Creating an instance of class
        // The object type is "ObjectHandle"
        var hostTransportCommandInstance = Activator.CreateInstance("Mcs.ControlMaster", "Mcs.ControlMaster.HostTransportCommand");

        // Getting properties for validate instance creation
        // Using Unwrap() method we can access to true Type (HostTransportCommand)
        var hostTransportCommandType = hostTransportCommandInstance.Unwrap().GetType();
        var hostTransportCommandProperties = hostTransportCommandInstance.Unwrap().GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);

        // Showing information about type HostTransportCommand
        Console.WriteLine($"The type from Mcs.ControllerMaster is {hostTransportCommandType}");
        Console.WriteLine("Showing public properties (they was added for testing purposed):");
        foreach (PropertyInfo property in hostTransportCommandProperties) {
            Console.WriteLine(property.Name);
        }
        Console.ReadKey();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...