Поэтому я некоторое время искал способ сделать это, и каждый раз, когда я что-то находил, это приводило к другой проблеме.
В общем, у меня есть игровая приставка. Консоль запускает фрагменты кода C#. Скомпилированная сборка должна быть другом текущей сборки, чтобы консоль знала обо всех типах в текущей сборке и могла ими манипулировать.
Проблема первая: каждый раз, когда вы запускаете консольную команду, создается новая сборка (я бы хотел избежать этого, если кто-нибудь знает, как это сделать), и чтобы она была дружественной сборкой, она должна иметь то же имя, что и последняя. К сожалению, вы не можете выгрузить предыдущую сборку, чтобы новая не могла перезаписать ее. Это заставляет меня использовать AppDomains.
Проблема вторая: если я заставлю каждую сборку использовать отдельный AppDomain, а затем выгружу последний, это сработает, но я не смогу манипулировать объектами из текущего AppDomain, потому что они не являются производными от MarshalByRef, поэтому, когда я передаю их в качестве параметров в script он пытается сериализовать их. Мне не нравятся домены приложений.
Поэтому я решил, что самым безболезненным способом будет просто создать сборки в одном и том же AppDomain с разными именами и каким-то образом установить их как дружественные сборки во время выполнения.
Я понимаю, что это может быть невозможно, поэтому приветствуются любые другие альтернативы.
РЕДАКТИРОВАТЬ: Чтобы сделать это более ясным. Сценарий должен получить доступ к внутренним компонентам основной/родительской сборки. А не наоборот. Я не могу сделать все общедоступным в основной сборке, потому что я хочу, чтобы код можно было использовать повторно.