2013-05-12 2 views
0

Моя структура решения в vs выглядит следующим образом.csharpcodeprovider не может скомпилироваться, когда сборка добавлена ​​в gac

  • MyRuleEngineFramework
  • RulesEditor

MyRuleEngineFramework является библиотека классов. RulesEditor - проект winforms. Последнее ссылается на первое, однако, что сборка нигде не потребляется внутри проекта редактора.

Есть только несколько строк кода, где я делаю вид реферирования:

CSharpCodeProvider provider = new CSharpCodeProvider(); 
CompilerParameters cp = new CompilerParameters(); 
cp.ReferencedAssemblies.Add("System.dll"); 
cp.ReferencedAssemblies.Add("MyRuleEngineFramework.dll"); 
cp.OutputAssembly = "temp.dll"; 
cp.GenerateInMemory = false; 
CompilerResults cr = provider.CompileAssemblyFromSource(cp, SourceCode); 

Приведенный выше код, выполненные хорошо, и я получил скомпилированную сборку в первый раз.

Затем я зарегистрировал MyRuleEngineFramework.dll для gac.

После этого сгенерированный код (SourceCode) не скомпилировался. Затем я удалил ссылку на DLL в проекте редактора (пока сборка все еще была в Gac), она все еще не скомпилировалась.

Теперь, почему это происходит?

+0

Что значит «не скомпилировать»? Какое сообщение об ошибке вы получаете? – svick

ответ

2

Компиляторы требуют эталонный комплект. Который никогда не должен храниться в GAC. GAC только там, чтобы помочь CLR найти правильную версию любой ссылочной сборки, которую вы использовали во время компиляции. Составители поэтому никогда смотрите в GAC для эталонного сборка. Они также не могут этого сделать, они не знают, какую версию искать.

Так что это пошло не так, когда вы добавили сборку в GAC. Теперь система сборки больше не копирует DLL в выходной каталог, так как может сказать, что это больше не требуется. Таким образом, код CodeDom больше не работает, так как эта ссылка отсутствует, и компилятор больше не может ее найти.

Не используйте GAC на вашей машине dev. Только, если вообще, на машине, на которой вы устанавливаете свою программу. В вашем конкретном случае это должно быть никогда, поскольку вы полагаетесь на сборку, которую вы компилируете, чтобы быть идентичной сборке, которая загружается при запуске кода.

+0

. Системная плата хранится в gac прямо сейчас. – deostroll

+1

Это не имеет значения. Компилятор использует эталонную сборку для System.dll, хранящуюся в c: \ program files \ reference assembly для .NET 4 и выше. Компилятор уже знает, как его найти. –

Смежные вопросы