내 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 });
}
이것은 DLL과 관련이 없습니다. * 리플렉션을 사용하여 * runtime *에서 유형을로드하고 있습니다. 유형은 컴파일 타임에 사용할 수 없습니다. 사용할 수있는 유일한 것은'TagLibFile'이라는 변수로 분명히 타입으로 사용할 수 없습니다. –
무슨 뜻인지 궁금합니다 –
왜 동적인가? 문제가있는 경우 더 나은 해결책이있을 수 있습니다. – nawfal