2012-07-10 1 views
0

저는 현재 C# 프로젝트에서 작업 중이며 C#에서는 전혀 경험이 없습니다.C#에서 런타임 중에 결정된 C++ DLL 사용

우리는 C++로 작성된 DLL 세트를 가지고 있으며, 이들은 동일한 클래스와 동일한 기능을 가지고 있지만 다르게 작동합니다. 예를 들어 우리 프로그램이 BMP 파일을 변환한다고 가정 해 보겠습니다. 우리는 BMP를 JPG, BMP를 PNG로 변환하는 DLL을 가지고 있습니다.

C#으로 작성된 프로그램은 어떻게 든 DLL을 래핑해야하지만 정적 인 방법으로는 작성하지 않아야합니다. 우리는 런타임 중에 사용중인 DLL을 변경할 수 있어야하고 필요할 때 새로운 DLL을 추가 할 수 있기를 원합니다 (런타임 중에도). 플러그인처럼.

귀하의 제안은이 접근법을 구현하는 것입니다.

+0

이러한 DLL은 C++ 클래스를 내보내거나 내보내기에 PInvoke 호환 기능 만 있습니까? – Dennis

+0

지금까지 코드에서 볼 수있는 한, 이들은 단지 PInvoke 호환 기능입니다. – hattenn

답변

1

당신이 당신의 모든 DLL이 미리 무엇인지 모르는 경우 Here은 Microsoft에서 제공하는 시설 등의 externDLLImport을 사용할 수 있습니다 함수 "LoadLibrary" "GetProcAddress"및 "FreeLibrary." 내가 아는 한, C#에는 일종의 Dynamic PInvoke를 자동으로 수행 할 방법이 없습니다. 자세한 내용은 this blog post을 참조하십시오.

또는 PInvoke를 사용하여 각 DLL에 대해 C# 래퍼를 만든 다음 관리되는 대리자를 사용하여 함수를 호출 할 수 있습니다. 그런 다음 대리자를 변경하여 런타임에 다른 함수 (다른 DLL에 있음)를 호출 할 수 있습니다. 이것은 컴파일 타임에 사용할 DLL의 전체 목록을 가지고있는 사용자에 달려 있습니다. 첫 번째 옵션보다 훨씬 강력합니다. 또한 런타임에서 모든 마샬링을 처리하도록하는 것이 수천 배 더 쉽습니다. 자세한 내용은 this MSDN article을 참조하십시오.

0

당신은 당신이 아마는 Win32를 호출해야합니다 자세한 내용 Go here 또는

1

가 C++에 이미있는 경우에, 나는 C++에서 관리되는 어셈블리를 작성하도록 선택할 것입니다.
walkthrough은 출발점이 될 수 있습니다. 특히 C++ 사용자는 C#을 배울 필요가 없습니다.
P/Invoke는 약간 느리지 만 P/Invoke는 런타임 예외로 이어지고 변경시 오류를 컴파일하지 않으므로 버전 관리가 더 중요합니다.