2016-10-11 10 views
1

내 C# 응용 프로그램에서 taglib-sharp dll (내 프로젝트의 bin/debug 폴더로 복사)을 가져온 후 다음과 같은 방식으로 라이브러리의 형식과 메서드를 사용했습니다.C에서 동적으로 링크 된 dll을 사용하는 방법

using TagLib; 

private void method() 
{ 
    TagLib.File file = TagLib.File.Create("C:\\temp\\some.mp3"); 
    TagLib.Tag tag = file.GetTag(TagLib.TagTypes.Id3v2); 
} 

이제 DLL을 동적으로 연결하고 싶습니다. 이 경우 동일한 기능을 어떻게 구현할 수 있습니까?

내가 무엇을 시도했다, 그건이 구현에서

using System.Reflection 

private void method() 
{ 
    Assembly TagLib = Assembly.Load("taglib-sharp"); 

    Type TagLibFile = TagLib.GetType("File"); 
    dynamic LibFile = Activator.CreateInstance(TagLibFile); 

    TagLibFile file = LibFile.Create("c:\\temp\\some.mp3"); 
} 

,으로 VisualStudio 내가 유형으로 tagLibFile 변수를 사용할 수 없다는 것을 말한다. 나는 dll로부터 타입을 얻었을 때, 나는이 타입의 변수를 생성 할 수있을 것이라고 생각했다.

그런데이 방법이 맞습니까?

P. 또한 invoke 메서드를 사용하려고했지만 첫 번째 인수로 전달해야 할 개체가 무엇인지 확실하지 않았습니다. 객체로서 저장

using System.Reflection 

private void method() 
{ 
    Assembly TagLib = Assembly.Load("taglib-sharp"); 

    // get the File type 
    var fileType = TagLib.GetType("TagLib.File"); 
    // get the overloaded File.Create method 
    var createMethod = fileType.GetMethod("Create", new[] { typeof(string) }); 

    // get the TagTypes method that contains Id3v2 field 
    Type tagTypes = TagLib.GetType("TagLib.TagTypes"); 
    // get the overloaded File.GetTag method 
    var getTagMethod = fileType.GetMethod("GetTag", new[] {tagTypes}); 
    // obtain the file 
    dynamic file = createMethod.Invoke(null, new[] { "C:\\temp\\some.mp3" }); 
    // obtain the Id3v2 field value 
    FieldInfo Id3TagField = tagTypes.GetField("Id3v2"); 
    var Id3Tag = Id3TagField.GetValue(tagTypes); 

    // obtain the actual tag of the file 
    var tag = getTagMethod.Invoke(file, new[] { Id3Tag }); 
} 
+1

이것은 DLL과 관련이 없습니다. * 리플렉션을 사용하여 * runtime *에서 유형을로드하고 있습니다. 유형은 컴파일 타임에 사용할 수 없습니다. 사용할 수있는 유일한 것은'TagLibFile'이라는 변수로 분명히 타입으로 사용할 수 없습니다. –

+0

무슨 뜻인지 궁금합니다 –

+0

왜 동적인가? 문제가있는 경우 더 나은 해결책이있을 수 있습니다. – nawfal

답변

1

는이 같은 일을해야한다 : 당신이 동적하려면

private void method() 
{ 
    var assembly = Assembly.Load("taglib"); 
    var type = assembly.GetType("namespace.File"); // namespace qualified class name 
    // assuming you only have one Create method, otherwise use reflection to resolve overloads 
    var method = type.GetMethod("Create"); 

    dynamic file = method.Invoke(null, new[] { "C:\\temp\\some.mp3" }); // null for static methods 
    var tag = file.GetTag(TagLib.TagTypes.Id3v2); // not sure if you can pass those params, 
                // may be do reflection to get them too 
} 

가 친절하게 다시 생각. dll을 참조 할 수 있다면 강력한 타이핑의 이점을 얻을 수 있습니다.

0

:

UPD는

아래 @의 nawfal의 awnser을 바탕으로

, 나는 다음과 같은 작업 코드를 가지고있다.

object file = LibFile.Create(fi.FullName); 

작동해야합니다.

동적 로딩 dll은 크게 다릅니다.

+0

OP가 요구하지 않은 것) –

+0

개체를 형식으로 사용할 때 컴파일러에서 파일 클래스의 멤버를 볼 수 없어 파일 인스턴스의 메서드 (예 : file.GetTag)를 사용할 수 없습니다. 예제를 업데이트했습니다. , 그것을 보여줍니다. –