2017-12-13 3 views
0

임베디드/참조 DLL을 사용하여 C# Reflection을 사용하는 메서드를 호출 할 수 있습니까?C#을 사용하여 메서드를 호출하는 동안 다른 DLL 어셈블리를 포함/참조하는 방법 Reflection

예를 들어 다음 시나리오를 고려하십시오. 내가 참고로 위의 DLL을 사용

namespace User 
{ 
    public class UserInfo 
    { 
     public static string Name = "Username"; 
    } 
} 

울부 짖는 소리로 클래스를 가지고 조립 호출 있는 User.dll을 가지고, 내가 할 수 다음 코드 액세스 UserInfo.Name 변수를 컴파일 할 수 있습니다.

using User; 
using System.Windows.Forms; 

public class Test 
{ 
    public Test() 
    { 
     MessageBox.Show("Name : " + UserInfo.Name); 
    } 
} 

는 위의 코드는 Test.dll에 조립라는 또 다른 DLL에 고려한다. Assembly.LoadFile ("Test.dll") 및 C# Reflection을 사용하여 생성자를 호출 할 때 파일을 찾을 수 없습니다. 런타임 오류가 발생했습니다.

오류

System.Reflection.TargetInvocationException : 호출 대상이 예외가 throw되었습니다. ---> System.IO.FileNotFoundException : 파일 또는 어셈블리 'DynamicAssembly, 버전 = 0.0.0.0, 문화 = 중립, PublicKeyToken = null'또는 해당 종속성 중 하나를로드 할 수 없습니다. 시스템이 지정된 파일을 찾을 수 없습니다. System.RuntimeMethodHandle.InvokeMethod에서 Test..ctor() --- 내부 예외 스택 추적 --- 끝에서 System.Reflection.RuntimeConstructorInfo에서 (객체 타겟 [] 인수 서명 SIG, 부울 생성자 개체) .Invoke

답변

0

Assembly.LoadFile 방법은 지정된 파일을로드 System.Reflection.ConstructorInfo.Invoke에서 (개체 [] 매개 변수) (BindingFlags의 invokeAttr 바인더 바인더 [] 매개은 CultureInfo 배양 개체). 귀하의 경우 Assembly.LoadFrom 메서드를 사용해야합니다. Please check for differences between Assembly.LoadFile and Assembly.LoadFrom

LoadFrom()는 퓨전 통과 한 이미 LoadFrom 컨텍스트에로드되는 경우 다른 경로로하지만, 동일한 ID와 다른 어셈블리로 리디렉션 될 수있다.

LoadFile()은 Fusion을 통해 바인딩하지 않습니다. 로더는 발신자가 요청한 내용을 정확히로드합니다. Load 또는 LoadFrom 컨텍스트를 사용하지 않습니다.

귀하의 실행 코드 샘플은

static void Main(string[] args) 
    { 
     var fileName = ""; //put here test.dll path 
     Assembly ass = Assembly.LoadFrom(fileName); 

     var type = ass.GetType("Test.Test"); 

     var test = Activator.CreateInstance(type); 
    } 
+0

감사 @nmkaya처럼 될 것이다. 나는 LoadFrom 메서드로도 시도했다. 그러나 문제는 참조하는 어셈블리 (User.dll)가 다른 경로에 있으면 메서드를 호출하지 않고 동일한 FileNotFound 예외를 가져 오는 것입니다. 그래서 유일한 해결 방법은 ** 메소드를 호출하기 전에 참조 어셈블리 (예 : User.dll)를 실행 가능한 응용 프로그램 디렉토리 **에 프로그래밍 방식으로 복사하거나 이동하는 것입니다. (예 : Debug \ bin). –

+0

@ ramanan.java, User.dll은 Test.dll의 위치 또는 Gac에 있어야합니다. 그렇지 않으면 Test.dll이 프로젝트 참조로 추가 된 경우에도 작동하지 않습니다.이 경우 테스트 프로젝트 어셈블리는 기본 앱 위치에도 복사됩니다. Test.dll의 위치에서 User.dll에 도달 할 수 있으면 Test.dll 및 User.dll을 복사 할 필요가 없습니다. 테스트 응용 프로그램에서 작동하는 방식을 확인했는데 상황에 다른 문제가있을 수 있습니다. 메인 애플리케이션은 사용자를로드 할 수 없습니다.dll은 다른 프로세스에 의해 잠겨 있기 때문입니다. –

관련 문제