2010-12-23 4 views
0

제목이 제 질문에 혼란 스럽습니다. DLL에서 호출 할 수있는 C#으로 API를 생성하십시오.

설명해 드리죠 : - 이 선배가 쓴 어떤 DLL을하고 다음과 같이 나는 C#에서 사용할 :

말은, DLL 이름을 기존 SeniorDLL 내가 그 DLL에서 함수를 SeniorFunc를 사용하고 싶습니다. 내가 할 것은 - 내가 먼저 함수 호출하기 전에 내가 쓰기,이 기능을 사용하려면

private delegate int SeniorFunc(IntPtr Blah); 

[DllImport("kernel32")] 
public extern static IntPtr LoadLibrary(string lpFileName); 

[DllImport("kernel32", CharSet = CharSet.Ansi)] 
public extern static IntPtr GetProcAddress(IntPtr hModule, string lpProcName); 

SeniorFunc fp_Senior; 

과 기능에

:

처리 INTPTR;

handle = IntPtr.Zero; 
    handle = LoadLibrary("<DLL Path>"); 

    IntPtr fPtr = GetProcAddress(handle, "SeniorFunc"); 
    fp_Senior = (SeniorFunc)Marshal.GetDelegateForFunctionPointer(fPtr, typeof(SeniorFunc)); 

그리고 나는 지금 내가 DLL에서 함수를 호출 할 수 있습니다하는 C#에서 나를 위해 같은 DLL을 만들 fp_Senior(<Parameter>);

를 통해이 기능을 사용합니다. 현재 DLL을 만들었지 만 DLL에 클래스 인스턴스를 만든 다음 ClassInstance.MyFunction(<Parameters>)처럼 액세스해야합니다.

인스턴스를 만들지 않고 함수 호출을 직접 얻으려면 어떻게해야합니까? 즉, (내가 맞는지 틀린 지 모르겠다) 어떻게 API를 만들 수 있습니까 ??

감사합니다.

답변

0

C#에서는 클래스 외부의 메서드는 없습니다. 따라서 메서드를 호출해야하는 경우 클래스 이름을 지정해야합니다.

현재 사용중인 DLL과의 차이점은 이러한 DLL이 C#과 같이 엄격한 객체 지향 접근법을 시행하지 않는 C/C++ 또는 다른 비.NET 언어로 작성되었다는 것입니다.

따라서 .NET 라이브러리에서 메서드를 호출 할 때 클래스의 인스턴스를 만들지 않아도됩니다. 메서드가 static으로 선언 된 경우 ClassName.MethodName()을 통해 직접 호출 할 수 있습니다.

1

여기에 인스턴스가 필요하지 않으며 모든 것이 정적 일 수 있습니다. 필요한 오류가 이런 식으로 뭔가가, 추가 검사 :

using System; 
using System.ComponentModel; 
using System.Runtime.InteropServices; 

internal static class NativeMethods { 
    public static void SeniorFunc(IntPtr arg) { 
     if (fp_Senior == null) lookUpSenior(); 
     fp_Senior(arg); 
    } 

    private static void lookUpSenior() { 
     loadSenior(); 
     IntPtr addr = GetProcAddress(SeniorModule, "seniorfunc"); 
     if (addr == IntPtr.Zero) throw new Win32Exception(); 
     fp_Senior = (SeniorFuncDelegate)Marshal.GetDelegateForFunctionPointer(addr, typeof(SeniorFuncDelegate)); 
    } 
    private static void loadSenior() { 
     if (SeniorModule == IntPtr.Zero) { 
      SeniorModule = LoadLibrary("mumble.dll"); 
      if (SeniorModule == IntPtr.Zero) throw new Win32Exception(); 
     } 
    } 
    private static IntPtr SeniorModule; 

    private delegate int SeniorFuncDelegate(IntPtr Blah); 
    private static SeniorFuncDelegate fp_Senior; 

    [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)] 
    private extern static IntPtr LoadLibrary(string lpFileName); 

    [DllImport("kernel32", CharSet = CharSet.Ansi, SetLastError = true)] 
    public extern static IntPtr GetProcAddress(IntPtr hModule, string lpProcName); 

} 

별도의 방법에 lookupSenior 유지의 포인트는 빠른 있도록 SeniorFunc()가 인라인받을 수 있도록하는 것입니다. 을 알고 있다면 항상 프로그램에서 이러한 함수를 사용하고 클래스의 정적 생성자를 작성하고 거기에서 조회를 수행 할 수도 있습니다. 널 검사를 저장하지만 해석하기가 약간 어려워집니다.

관련 문제