Вы можете загрузить сборку и получить доступ к ее типам через Reflection. Здесь есть несколько примеров: http://www.csharp -examples.net / mirror-examples / , и я извлек некоторые из наиболее интересных:
Assembly testAssembly = Assembly.LoadFile(@"c:\Test.dll");
Type calcType = testAssembly.GetType("Test.Calculator");
object calcInstance = Activator.CreateInstance(calcType);
// Get property value
PropertyInfo numberPropertyInfo = calcType.GetProperty("Number");
double value = (double)numberPropertyInfo.GetValue(calcInstance, null);
....
// invoke public instance method: public void Clear()
calcType.InvokeMember("Clear",
BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
null, calcInstance, null);
Вы можете указать, что плагины написаны определенным образом, чтобы вы знали, какие классы создавать, какие методы вызывать и так далее. По сути, неформальный интерфейс, который выражается через документацию, а не через код.
Теперь, это не очень хороший способ реализовать архитектуру плагинов, потому что вы теряете много времени проверки во время компиляции при написании плагинов, и, вообще говоря, лучше воспользоваться возможностью развертывания дополнительной DLL.