2011-02-15 4 views
19

저는 C#에 익숙하지 않아 DLL 사용법을 배우려고합니다. 내 개체를 DLL에 래핑하려고하고 내 프로그램에서 사용하려고합니다. 컴파일러는 SomeMethodInMyProgram()가 무엇인지 알 수 없어DLL에서 함수 호출?

public class Foo // its in the DLL 
{ 
    public int ID; 
    public void Bar() 
    { 
     SomeMethodInMyProgram(); 
    } 
} 

그래서 나는 DLL이 팩을하려고하지만 난 할 수 없습니다.

나는 그것을 좋아 사용하고 싶습니다 :

class Program // my program, using DLL 
{ 
    static void Main(string[] args) 
    { 
     Foo test = new Foo(); 
     test.Bar(); 
    } 
} 

답변

20

솔루션 탐색기를 통해 DLL 추가 - 참조 추가 -> 참조 추가 "찾아보기"DLL을 누른 다음 사용할 수 있어야합니다.

4

실제로 런타임에 응용 프로그램, DLL의 따라서 동적 부분에 DLL을로드해야합니다. DLL에 어떤 기능이 있는지 정의하는 헤더 파일이 필요하므로 컴파일시 정의 된 기능을 알 수 있습니다. 내 지식은 여기에 C++을 기반으로하므로 C#에서는 어떻게 작동하는지 모르지만 그럴 것입니다 ...

+3

C#은 C \ C++과 완전히 다릅니다. .NET 런타임은 .dll에서 메서드 서명이 무엇인지 확인하기 위해 충분한 정보를 추출 할 수 있습니다 (C#에는 헤더 파일이 없습니다) – Jimmy

+2

아, 그럼. erm ... carry on – thecoshman

28

DLL 유형에 따라 다릅니다. 이것은 .NET에 내장되어 있습니까? 관리되지 않는 코드 인 경우 여기에 예제가 있습니다. 그렇지 않으면 Rob의 응답이 작동합니다.

관리되지 않는 C++ DLL 예 :

using System; 
using System.Runtime.InteropServices; 

당신은 그런 사람들의 각각을 같이 DllImport

[DllImport(@"C:\Cadence\SPB_16.5\tools\bin\mpsc.dll")] 
static extern void mpscExit(); 

또는

[DllImport("user32.dll", CharSet = CharSet.Unicode)] 
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type); 

를 사용해야은 다음과 같이 호출됩니다

// a specific DLL method/function call 
mpscExit(); 
// user32.dll is Microsoft, path not needed 
MessageBox(new IntPtr(0), "Test", "Test Dialog", 0); 
+1

남자가 분명히 간단한 'Add Reference'를 묻는 이유는 무엇입니까? 새 개발자 인 Extern과 DllImport는 다소 고급입니다. – TheMonkeyMan

+6

이러한 것들은 DllImport가 매우 쉽고 흔한 "쉬운"방법입니다.이 FYI를 수행하는 훨씬 더 진보 된 방법이 있습니다. –

2

나는 여기서 파티에 늦었지만 나 같은 머리카락을 끌어 당기는 사람에게이 대답을 남기고있다. 그래서 기본적으로, 나는이 문제를 직면했을 때 VS IDE의 명품을 가지고 있지 않았다. 나는 csc를 사용하여 cmdline을 통해 코드를 컴파일하려고 시도했다. dll을 참조하려면 컴파일러 플래그/r : PathToDll/NameOfTheDll을 csc에 추가하기 만하면됩니다.

명령은

CSC/R과 같습니다 PathToDll/NameOfTheDll/아웃 : FileWhichIsReferencingTheDll.cs에서 OutputExeName FileWhichIsReferencingTheDll.cs

호출하여 (기능에 액세스 할 수 using namespace AppropriateNameSpace;를 추가 class.functionName 정적 인 경우 또는 클래스의 객체를 만들고 객체에서 함수를 호출하면됩니다.