Примечание: я думаю, что OP пытается создать что-то вроде плагина. Если так, есть много пользовательских библиотек, для которых я предлагаю вам использовать уже реализованные вещи, а не создавать колесо самостоятельно
Это довольно распространенная ошибка, когда люди впервые начинают играть со сборками во время выполнения. Это было сделано :) Проблема в том, что вы используете Assembly.LoadFile
для загрузки вашей сборки в домен приложения. Не вдаваясь в подробности, даже если вы загрузите одну и ту же dll с помощью Assembly.LoadFile
, типы, определенные в сборке, будут обрабатываться по-разному. Допустим, у меня есть сборка A
../MyFolder/A.dll
public class MyType;
public class MyAnotherType;
....
var aDll = Assembly.LoadFile("A.dll");
var aDllAgain = Assembly.LoadFile("A.dll");
var myTypeFromADll =aDll.GetType("MyType");
var myTypeFromADllAgain = aDllAgain.GetType("MyType");
//Yes this is of type MyType but since you used LoadFile
//It is of type MyType from a_dll code base
var instanceFromADll = Activator.CreateInstance(myTypeFromADll);
//Yes this is of type MyType but since you used LoadFile
//It is of type MyType from a_dll_again code base
var instanceFromADllAgain = Activator.CreateInstance(myTypeFromADllAgain);
Итак, вы получаете InvalidCastException, потому что вы пытаетесь преобразовать экземпляр типа X в тип Y.
Решение простое. Вы должны использовать метод Assemly.Load
, и если что-то не так, то Assembly.LoadFrom
. Если вы не знаете точно, что делаете, держитесь подальше от Assembly.LoadFile
.
Вот очень хорошее и подробное объяснение. Лучшие практики