2017-11-05 25 views
1

나는 어떻게 runtime locates assemblies을보고 있는데 실제로로드하는 것보다 Assembly.Load에 의해 발견 된 어셈블리의 경로를 얻는 방법이 있는지 궁금해하고 있습니까?어셈블리를로드하는 대신 경로를 가져 오는 방법은 무엇입니까?

AssemblyDefinition.ReadAssemblyMono.Cecil의 경로가 어셈블리에 직접 필요하므로 직접 찾지 않으려 고합니다. 대신 표준 System.ReflectionMono.Cecil의 기능을 결합하고 싶습니다.

+0

'Assembly.Location'을 사용해 보셨나요? – Dido

+0

그럴 수는 있지만 어셈블리는 응용 프로그램 도메인에로드됩니다. 나는 그것을 피하고 싶습니다. –

답변

2

Mono.Cecil은 어셈블리 해결자를 사용하여 어셈블리 이름에서 AssemblyDefinition을 가져옵니다.

AssemblyNameReference reference = AssemblyNameReference.Parse("Foo, Version=1.0.0.0"); 
DefaultAssemblyResolver resolver = new DefaultAssemblyResolver(); 
AssemblyDefinition foo = resolve.Resolve(reference); 
1

새 응답

당신의 AssemblyName을 사용할 수 있습니다. 불행히도 나는 내 개발 기계가 아니기 때문에 이것을 시험 할 수 없다. 그러나 AssemblyName은 Assembly.Load()의 mscorlib 구현에서 사용됩니다.

나는 CoreCLR을 통해 다이버가 실제로 파일을 찾는 위치에 대한 통찰력을 얻을 수 있었는지 알 수 없었지만 실패했습니다. 이 방법이 효과가 없다면 CLR에 직접 응답 해보십시오. 나는 FindAssembly 전화

var assemblyName = new AssemblyName("YourAssembly versionwhateveretc"); 
var path = new Uri(assemblyName.EscapedCodeBase).LocalPath; 

올드 대답 당신을 위해

합니까 ReflectionOnlyLoading 작업에 좁혀?

이렇게하면 현재 AppDomain에 어셈블리 메타 데이터를 완전히로드하지 않고도 어셈블리 메타 데이터를 검사하고 상호 작용할 수 있습니다.

+0

어제 시도해이 예외가 : System.IO.FileLoadException : 'System.Core, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089'어셈블리에 대한 종속성을 미리 확인할 수 없기 때문에이를 해결할 수 없습니다. ReflectionOnly API를 사용할 때 종속 어셈블리는 ReflectionOnlyAssemblyResolve 이벤트를 통해 필요에 따라 사전로드되거나로드되어야합니다. '가능한 많은 어셈블리 복잡성으로 인해 실제로 어셈블리를로드하지 않도록하고 싶습니다. –

+0

우려 성능이 관련되어 있습니까, 아니면 어셈블리를로드하면 수행하려는 작업과 관련된 문제가 발생합니까? 또 다른 옵션은 새로운 앱 도메인에로드하여 경로를 얻은 다음 앱 도메인을 닫는 것입니다. –

+0

좋은 질문입니다. 내가하고있는 일은 표준 인터페이스 대신에'Mono.Cecil'을 사용하도록 내가하고있는 언어에 대한 인터페이스 모듈을 .NET API로 다시 작성하는 것이다. 지금 당장 나는 4 개의 어셈블리에서 타입을 컴파일하는 것이 대략 0.6 초 걸린다는 문제가있다. 표준 반사를 통해 어셈블리를로드하는 데 걸리는 시간을 측정하는 데 신경 쓰지는 않았지만 표준 반사를 피하기 위해 가능한 한 많이 노력하고있는 interop 모듈을 다시 작성하기로 결정했습니다. –