c # загружать на лету сгенерированную частичную сборку класса - PullRequest
0 голосов
/ 18 июля 2011

Я бы хотел переопределить функцию виртуального базового класса на лету и использовать этот переопределенный метод в приложении. Если я напишу базовый пример класса:

partial Class myBase
{
   public myBase() {}
   public virtual void DoStuff()
   {
      throw new Exception("this function is not overriden");
   }
}

partial Class myDeriv : myBase
{
   public myDeriv() {}
}

А теперь я бы хотел переопределить myDeriv.DoStuff на лету. Поэтому я создаю блок строкового кода и компилирую его, используя

CSharpCodeProvider.CompileAssemblyFromSource

метод. После записи этого dll на диск я попытался загрузить его, используя

Assembly.LoadFrom("onTheFly.dll");

Но приложению не удается найти эту переопределенную функцию. Если у вас есть другие лучшие решения, я также открыт для них ... Мне просто нужно переопределить функции на лету ..

Спасибо всем!

1 Ответ

1 голос
/ 30 декабря 2011

Я думаю, что это невозможно, возможно, вызвано тем же правилом, как описано здесь или здесь

Цитата из оригинала:

"У вас не может быть двух частичных классов, ссылающихся на один и тот же класс, в двух разные сборки (проекты). Как только сборка скомпилирована, метаданные запекаются, и ваши классы больше не являются частичными. частичный классы позволяет разделить определение одного и того же класса на два файлы ".

или

"Вы не можете использовать частичное ключевое слово для разделения кода для класса между проектами. Частичное ключевое слово - хитрость компилятора; компилятор выведет один единственный класс из найденных частей, поэтому все части класса должны существовать с одним и тем же двоичным файлом. Однажды класс скомпилирован, от него не осталось и следа, являющегося частичным классом.

Если вы хотите расширить существующий класс, вам нужно либо унаследуйте это (если это не запечатано), или создайте свой собственный новый класс, который содержит классы, из которых вы хотите объединить информацию. "

...