2010-12-12 3 views
0

몇 가지 온라인 예제를 따라 C#으로 DLL 함수를 가져 왔습니다. 함수는 C# 클래스의 일부로 선언되어야합니다. 그러나 다른 C# 클래스에서 이러한 함수를 사용하려면 어떻게 선언을 공유 할 수 있습니까?어떻게 파일간에 C# DllImport 함수를 공유 할 수 있습니까?

가장 좋은 해결책은 C++ DLL 함수를 일반 클래스로 가져와 내 응용 프로그램 전체에서이 방법을 사용하는 것입니다.

미리 감사드립니다.

편집 : 아래 제안을 시도했지만 지금은 구조체를 사용하려고하는 "ImportSomeStuff의 보호 수준으로 인해 액세스 할 수 없습니다."라는 오류가 나타납니다. 모든 것이 공개 된 것처럼 보이므로 무엇을 시도 할 수 있습니까?

class ImportSomeStuff 
{ 
    [StructLayout(LayoutKind.Sequential)] 
    public struct MyStruct 
    { 
     public uint nData; 
    } 

    public delegate void MyCallback(ref MyStruct myStruct); 

    [DllImport("My.dll", CallingConvention = CallingConvention.Cdecl)] 
    [return: MarshalAs(UnmanagedType.I1)] 
    public static extern bool AddCallback(MyCallback callback); 

    [DllImport("My.dll", CallingConvention = CallingConvention.Cdecl)] 
    [return: MarshalAs(UnmanagedType.I1)] 
    public static extern bool RemoveCallback(MyCallback callback); 
} 

(다른 파일)

class DoSomeStuff 
{ 
    public List<ImportSomeStuff.MyStruct> listStuff = new List<ImportSomeStuff.MyStruct>(); 
} 

답변

3
public static class Native 
{ 
    [DllImport("nativelib.dll")] 
    public static extern int SomeFunction(); 
} 

그리고 당신은 모든 곳에서이 함수를 호출 할 수 있습니다

Native.SomeFunction(); 
+0

감사합니다. 내 함수는 또한 C#에서 선언 한 구조체를 사용하지만 이제는 "[클래스]가 사용하는 보호 수준으로 인해 액세스 할 수 없다"라는 오류가 발생합니다. 어떤 제안? – parsley72

+0

@parsley 그런 다음 구조체를 공개합니다. – CodesInChaos

+0

위의 코드 예제를 참조하십시오. – parsley72

3

당신이 그들을 공개 할 경우 ClassName.FunctionName()로 액세스 할 수 있어야합니다 그래서 그들은 정적 함수입니다. 마침내 C 함수를 사용하는 방법입니다.

하지만 일반적으로 내 기본 interop 항목을 공개하지 않습니다. 내 interop 어셈블리에서 내부적으로 유지하고 C# 스타일에 더 잘 맞는 공용 래퍼를 작성합니다.

+0

는 동의했다. 나는 더 많은 시간이있을 때 그것을하고 싶다 그러나 이것은 단지 그것을 작동 시키려고 노력하고있다! – parsley72

관련 문제