2013-03-12 2 views
3

내 응용 프로그램에는 dll (bog 표준 .NET 어셈블리)을 플러그 인으로로드하는 플러그 인 구조가 있습니다. 디스크 (Assembly.LoadFrom(file))에서 직접 해당 dll을로드하거나 dll을 메모리에 먼저 복사 한 다음 바이트 배열 (Assembly.Load(IO.File.ReadAllBytes(file)))에서로드하는 응용 프로그램 폭 넓은 옵션이 있습니다.어셈블리를로드하지 않고 정보 얻기

플러그인 개발자가 특정 로딩 동작을 강제할지 여부를 선택하는 옵션을 추가하고 싶습니다. 나는 이것을 위해 AssemblyAttributes를 사용하고 ReflectionOnly이 dll을로드하여 속성이 정의되어 있는지 확인했다. 그러나 dll은 reflectiononly되지 않은 다른 어셈블리에 의존하기 때문에 GetCustomAttributesData를 사용하여이 정보를 얻을 수 없었습니다. 이제 나는 첩자가 된 카프카스키 게임에 빠진다.

플러그인 개발자가 실제 DLL을로드하기 전에 내 앱과 통신하는 좋은 방법은 무엇입니까? AssemblyAttributes는 이동하는 방법입니까, 그렇다면 reflectiononly 로딩이 실패하지 않도록하려면 어떻게해야합니까?

편집 :

내가 어셈블리 속성을 반복하는 Mono.Cecil을 참조. 처음으로 세실을 사용했습니다. 내 개발자 컴퓨터의 초기 테스트가 작동하는 것 같습니다.

Private Function ExtractAssemblyLoadBehaviour(ByVal file As String) As GH_LoadingBehaviour 
    Try 
    If (Not IO.File.Exists(file)) Then Return GH_LoadingBehaviour.ApplicationDefault 

    Dim assembly As AssemblyDefinition = AssemblyDefinition.ReadAssembly(file) 
    If (assembly Is Nothing) Then Return GH_LoadingBehaviour.ApplicationDefault 

    Dim attributes As Collection(Of CustomAttribute) = assembly.CustomAttributes 
    If (attributes Is Nothing) Then Return GH_LoadingBehaviour.ApplicationDefault 
    For Each Attribute As CustomAttribute In attributes 
     Dim type As TypeReference = Attribute.AttributeType 
     If (type.FullName.Contains("GH_CoffLoadingAttribute")) Then Return GH_LoadingBehaviour.ForceCOFF 
     If (type.FullName.Contains("GH_DirectLoadingAttribute")) Then Return GH_LoadingBehaviour.ForceDirect 
    Next 

    Return GH_LoadingBehaviour.ApplicationDefault 
    Catch ex As Exception 
    Return GH_LoadingBehaviour.ApplicationDefault 
    End Try 
End Function 
+0

두 옵션을 모두 제공하는 이유는 무엇입니까? 그냥 궁금해서 ... – Jobo

+0

이 시점에서 대부분은 유산입니다. 원격 위치에서 dll을로드 할 수 있기를 원하며 일부 dll은 어떤 이유로 디스크에서로드해야합니다. 이 옵션을 제거하고 단지 dll 단위로 결정하는 것이 최선이지만 개발자가 어떤 일이 일어날지를 제어 할 수 있기를 바랍니다. –

답변

1

반사 전용로드는 여전히로드하므로로드를 완료하면 너무 늦어서 질문하지 않습니다.

한 가지 옵션은 별도의 AppDomain에서 리플렉션 전용로드를 수행 한 다음 결과를 주 코드로 되돌려 보내고 새 AppDomain을 버리는 것입니다.

속성을 사용하는 대신 플러그인 개발자에게 필요한 정보 나 옵션이 포함 된 일종의 매니페스트 파일 (예 : 텍스트 또는 XML)을 포함하도록 요청할 수 있습니다.