//m = new Message();
m = MessageFactory.GetMessage();
А вот в MessageFactory уже искать тот метод, который создаст нужный объект (например, как указал
freeExec).
Как вариант - использовать IoC-контейнер:
1) в главной сборке создать контейнер.
2) найти нужную сборку и передать в неё этот контейнер
3) в той сборке забиндить нужный класс на этот интерфейс в переданном контейнере.
Тот же приём можно использовать, когда в решении есть два проекта, второй проект использует первый проект (первый добавлен в зависимостях), а вот первому нельзя добавить второй проект в зависимостях. Решение - контейнер в первом проекте, а классы биндятся во втором. Тогда пункт 2 не нужен.