2013-05-12 5 views
0

vs의 솔루션 구조는 다음과 같습니다.gac에 어셈블리를 추가 할 때 csharpcodeprovider를 컴파일 할 수 없습니다

  • 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이 더 이상 필요 없다는 것을 알 수 있으므로 더 이상 출력 디렉토리에 DLL을 복사하지 않습니다. 따라서 참조 어셈블리가 없어지고 컴파일러에서 더 이상 찾을 수 없으므로 CodeDom 코드가 더 이상 작동하지 않습니다.

dev 컴퓨터에서 GAC를 사용하지 마십시오. 프로그램을 설치하는 시스템에서만 가능합니다. 코드를 실행할 때로드 된 어셈블리와 동일하게 컴파일 할 어셈블리를 사용하기 때문에 특별한 경우에는 절대로 안됩니다.

+0

System.dll은 gac에 저장되어 있습니까? – deostroll

+1

그게 관련이 없습니다. 컴파일러는 .NET 4 이상용 c : \ program files \ reference 어셈블리에 저장된 System.dll 용 참조 어셈블리를 사용합니다. 컴파일러는 이미 그것을 찾는 방법을 알고 있습니다. –