2011-11-20 3 views
3

.dll은 C++/CLI 및 .NET으로 작성되었습니다. 따라서 .NET 응용 프로그램을 대상으로합니다. API는 관리되는 형식을 사용하는 래퍼 집합이므로 NET 네이티브 형식입니다. 나는 .DLL 수입과 같은 기능을 추가 한 :C# DLLImport for C++ dll

[DllImport(@"maplib.dll")] 
public static extern bool initialize(string a); 

내 C# 코드에서이 함수를 호출 할 때 나는 또 다른 기능 등을 추가 할 경우, 그것은 잘 작동하지만 ..

[DllImport(@"maplib.dll")] 
public static extern bool initialize(string a); 
public static extern bool runfile(string a, string b); 

프로그램을 실행할 때이 오류가 발생합니다.

"메서드 'runfile'에 구현이 없으므로 'myapp, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'어셈블리에서 'myapp.main'유형을로드 할 수 없습니다. (RVA 없음). "

왜이 오류가 발생하며 어떻게 해결할 수 있습니까?

[DllImport(@"maplib.dll")] 
public static extern bool initialize(string a); 
[DllImport(@"maplib.dll")] 
public static extern bool runfile(string a, string b); 

하지만 당신의 DLL이 .NET의 경우 왜 그냥하기 위해 정기적 참조를 추가하지 당신은 C# 코드를 사용하는 것처럼 사용 :

답변

13

당신은 당신이 두 가지 기능을 원하는 두 번 경우 DllImport 속성을 추가해야합니다 ?

+0

나는 그것에 대한 참조를 추가 할 수 있지만, 그것이 의미가있는 경우 사용 지시문을 작성할 때 나타나지 않습니다. – david

+0

이것은 네이티브 C++로 함수를 내 보낸 때문입니다. 대신 관리되는 클래스에 정적으로 넣어보십시오. – Krumelur

+0

또한 ref 클래스를 public으로 만들고 네임 스페이스에 넣습니다. – Simon

2

나는 이것을 이해하므로 C++로 구현 된 관리되는 클래스 라이브러리를 만들었습니다. 이 클래스 라이브러리 (어셈블리)를 다른 관리되는 코드 (C#, VB.NET 등으로 작성)에서 사용하려고합니다. 현재, 호출 네이티브 C++과 같은 몇 가지 방법 (당신의 API)를 수출했다 :

public bool initialize(string a) { 
    // ... 
} 

public bool runfile(string a, string b) { 
    // ... 
} 

이것은 당신이 코드를 네이티브 C++에서 라이브러리를 호출 할 수 있도록하려는 경우 유용하지만, 당신은 단지 관리 코드를 사용하려는 경우

public ref class MyLibraryFunctions { 
    public: 
     static bool initialize(string a); 
     static bool runfile(string a, string b); 
}; 

이 방법, 당신이 당신의 C# 코드에서 DllImport 필요하지 않습니다 : 라이브러리를 호출, 당신이 관리되는 코드로 API를 작성하는 것이 좋습니다. 너는 할 수있다 :

using Something.MyLibrary; 
.... 
    public void doSomethingThatNeedsMyLibrary() { 
     MyLibraryFunctions.initialize(someString); 
    } 

나는 당신의 질문을 정확하게 이해했다는 것을 희망한다.