Все на C#
Итак, есть:
1) Прога с поддержкой плагинов
2) Ядро, в котором написан абстрактный класс Plugin (kernel.dll)
Как создаются сейчас плагины?
1) Разработчик качает kernel.dll
2) Указывает в References эту сборку и указывает namespace'ы
3) Создает свой класс:
public class MyPlugin : Plugin { }
4) переопределяет абстрактные функции, определенные в ядре.
Собственно плагин готов...

И загружается из сборки как класс Plugin, но в нем уже все переопределено и наш плагин работает.
Хотелось избавиться от некоторых проблем...

, которые все сводятся к тому, чтобы не давать качать класс kernel.dll разработчикам.
Например, в самом простом случае дать только Interface с методами, которые требует переопределить, но тогда внутри этих методов нельзя будет вызывать некоторые вспомогательные функции, определенные в ядре.
Вопрос: как сделать поддержку плагинов, чтобы не давать никаких реализованных классов и функций разработчикам плагинов?
Чтобы все было ясно, простой гипотетический пример:
Я разработчик фотошопа, хочу сделать поддержку плагинов — сжатие изображений. Разработчикам требуется переопределить функции Compress и DeCompress, при этом вызывая ядерную функцию GetQuality — качество сжатия.
Я мог бы дать им абстрактный класс в котором определена функция GetQuality, но не хочу. Думаю, проблема понятна.