DLL을 통해 C# 코드의 C 클래스에 액세스
C# 코드에서 C DLL과 인터페이스할 때 클래스에 직접 액세스하려고 하면 제한이 발생합니다. DLL 내에 정의되어 있습니다. P/Invoke의 함수 노출 기능에도 불구하고 클래스 내의 함수는 비정적 멤버 변수에 의존하므로 인스턴스 생성이 필요합니다.
P/Invoke 및 간접 액세스
직접 액세스하는 동안 클래스 액세스는 불가능하므로 P/Invoke를 간접적으로 활용하여 클래스 멤버에 액세스할 수 있습니다. 이 접근 방식에는 클래스 멤버 함수를 호출하는 비멤버 함수를 만드는 것이 포함됩니다.
예제 코드
다음 C 코드를 고려하세요.
class Foo { public: int Bar(); }; extern "C" Foo* Foo_Create() { return new Foo(); } extern "C" int Foo_Bar(Foo* pFoo) { return pFoo->Bar(); } extern "C" void Foo_Delete(Foo* pFoo) { delete pFoo; }
여기서 C 코드는 비멤버를 통해 Foo 클래스를 노출합니다.
C# 인터페이스
C#에서 P/Invoke는 다음 함수에 액세스할 수 있습니다.
[DllImport("Foo.dll")] public static extern IntPtr Foo_Create(); [DllImport("Foo.dll")] public static extern int Foo_Bar(IntPtr value); [DllImport("Foo.dll")] public static extern void Foo_Delete(IntPtr value);
C# 코드는 이제 IntPtr 값을 관리해야 합니다. 래퍼 클래스로 래핑할 수 있습니다.
대체 접근 방법
C 코드의 직접적인 소유권이 불가능할 경우 별도의 DLL을 생성하여 원래 DLL을 래핑하고 P/Invoke를 제공할 수 있습니다. 레이어를 사용하여 C 클래스와의 C# 코드 상호 작용을 단순화합니다.
위 내용은 P/Invoke를 사용하여 C#에서 C 클래스에 어떻게 액세스할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!