2009-11-05 4 views
6

일부 타사 어셈블리를 포함하여 ILMerge를 사용하여 여러 .NET 어셈블리를 병합합니다. 그렇게함으로써 타입 정의가 정의 된 어셈블리에 묶여 있다는 사실에 몇 가지 오류가 발생했습니다.병합 된 어셈블리 (ILMerge)의 .NET 형식 정의

간단한 예제는 내 App.config의 log4net 구성 섹션 정의입니다. log4net 어셈블리는 일단 병합 된 어셈블리에 병합되면 존재하지 않으므로 type = "log4net.Config.Log4NetConfigurationSectionHandler, log4net"을 사용합니다. 큰 문제는 아니지만 어셈블리 이름을 병합 된 어셈블리로 변경하면 제대로 작동합니다.

약간 더 복잡한 예제는 이진 직렬화 형식입니다. 우리 시스템은 바이너리 직렬화를 사용하여 프로세스간에 특정 객체를 보냅니다. 모든 직렬화 가능 객체는 다른 모든 프로젝트가 참조하는 공통 어셈블리에 정의됩니다. 기본 이진 직렬화를 사용하고 있었지만 개체 직렬화 된 병합 된 어셈블리를 찾을 수 없다는 오류가있는 개체를 deserialize 할 때 실패하기 시작했습니다. 다시 한번 말하지만 큰 문제는 아니며 주어진로드 된 어셈블리에서 유형을 찾는 사용자 정의 SerializationBinder를 구현했습니다.

이전 예에서는 직렬화 된 형식 참조가 다른 직렬화 가능 형식 일 때 더욱 복잡해졌습니다. 나는 점점 더 다루기 어려워지는 점점 더 많은 문제들에 계속해서 뛰어 들었다.

여기에서 얻으려고하는 점은 .NET 유형 시스템과 ILMerge가 잘 작동하지 않는 것입니다. 누구든지이 문제를 어떻게 해결했는지에 대한 경험이 있습니까? .NET 런타임에서 유형이 무엇이라고 말하는지 상관하지 않는다고 말할 수 있습니까? 어디서나 찾을 수 있습니까?

참고 : 어셈블리를 병합하는 이유를 묻는 질문에 답하지 마십시오.이 질문의 요지는 아닙니다. 문자열의 위험 및 코드에서 (물리적 위치) 문자열에

+0

WAG : 아직 DataContractSerializer를 사용해 보셨습니까? NetDataContractSerializer가 유형에 바인딩되어 있기 때문에이를 사용할 수 없지만 보통의 오래된 DCS가 당신을 위해 작동해야합니다 ... – Will

답변

-2

에 오신 것을 환영합니다 ..

그런 종류의 모든 도구

비슷한 문제가 발생하고 더 현명하게, 많은 DEVS 및 바인딩과 같은 런타임 기능의 디자이너와 직렬화는 실제로 그것을 상상하지는 못했지만 ILMerge를 '스마트 한'도구로 확실하게 밀어 넣었습니다. 너무 똑똑해서 유형을 잘라낼 수도 없습니다.

여기에서는 버전 관리도 사용되며, 구성,. * 및 별표 표시가 있으며 Redmond의 버전 독립성도 도움이되지 않습니다.

세 번째 파티 비트와 관련된 문제가 계속 발생합니다. 그리고 나도 믿어. 병합이 필요하다는 것을 안다. MS JIT가 큰 응용 프로그램을 시작하기까지 시간이 좀 걸릴 수있다. (아니, 이전보다 느린 NGEN 또는 최적화 된 3.5SP1 로딩을 원하지 않는다. System.Core 또는 천국 - WPF가 부풀어 오르기 때문에).

imho는 최소한 대규모로 최소한 스캔하고 처리하는 데 적합한 상업용 도구를 사용하는 것이 가장 좋습니다 (즉, 기존의 통증 및 난독 화 경험으로부터). 장기적으로 소스가없는 경우 기존 IL 코드를 계측하는 결과를 초래할 수 있습니다. 대신 어셈블리의 모듈을 빌드 :

4

예,이 문제에 대한 해결책이 -

[카시오 - 석회질 발명가에 의해 설계된 그리고 이렇게 지구 온난화 문제를 해결에서 INotifyPropertyChanged 문자열 발명이 있었다]!

.net 용 컴파일러에는 어셈블리 대신 모듈을 만드는 옵션 (/ target : C# 및 VB 용 모듈)이 있습니다.그런 다음 여러 모듈을 컴파일러에 전달하여 최종 어셈블리를 빌드하는 데 사용할 수 있습니다.

물론이 모든 것은 사용자가 해당 타사 어셈블리에 대한 소스를 가지고 있다고 가정합니다. 당신이 그것을 얻을 수 없다면 아마도 제 3 자 어셈블리의 .netmodule 버전이 제 3 자로부터 조달 될 수 있습니까?

그래도 작동하지 않으면 마지막 옵션이 있습니다. 분명히 당신은 이미 일리노이에 대한 제 3 자 어셈블리를 분해하고 있습니다. IL 파일에서 어셈블리 정보를 제거하고 "ilasm/dll"을 사용하여 다른 .netmodule처럼 사용할 수있는 .netmodule을 빌드하십시오!

어셈블리 대신 모듈을 사용하면 더 이상 어셈블리 기반 문제가 없어야합니다.

사실 우리는 ILMerge를 더 이상 사용하지 않음으로써 ILMerge에 대한 문제점을 해결했지만 실제로는 최상의 솔루션이 아닙니까? (나는 .netmodules 내 경험은 누구에게 유용하지 않을 것이라고 생각하고 있었다 그리고 여기!)
.netmodule instead of assembly
ILASM with .netmodules

여러

0

:

이 당신을 위해 작동 희망, 여기에 몇 가지 편리한 연결입니다 몇 년 후, 같은 문제를 발견하고 해결책을 찾았습니다. AssemblyInfo.cs 파일에 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "logging.config", Watch = true)]을 추가하면 log4net 어셈블리를 병합 할 때이 기능이 작동합니다.