2012-02-09 3 views
1

메서드가있는 관리되지 않는 클래스를 포함하는 DLL이 있습니다. 그 방법을 C++/CLI에서 호출하려고합니다.C++/CLI - DLL에 정의 된 관리되지 않는 함수 호출

필자의 독서로 P/Invoke가 사용되었다는 사실을 알게되었습니다. 그러나, 나는 그것이 작동하게하는 방법을 찾아내는 것처럼 보일 수 없다. DLL을에서

은, 다음의 클래스가 정의 :

//Header: 
namespace MathFuncs 
{ 
    class MyMathFuncs 
    { 
    public: 
     static __declspec(dllexport) double Add(double a, double b); 
     static __declspec(dllexport) double Subtract(double a, double b); 
     static __declspec(dllexport) double Multiply(double a, double b); 
     static __declspec(dllexport) double Divide(double a, double b); 
    }; 
} 

//Source: 
namespace MathFuncs 
{ 
    double MyMathFuncs::Add(double a, double b) { 
     return a + b; 
    } 

    double MyMathFuncs::Subtract(double a, double b) { 
     return a - b; 
    } 

    double MyMathFuncs::Multiply(double a, double b) { 
     return a * b; 
    } 

    double MyMathFuncs::Divide(double a, double b) { 
     if (b == 0) { 
      throw new invalid_argument("b cannot be zero!"); 
     } 
     return a/b; 
    } 
} 

에서 내가 읽은 게다가, 그때 내 코드에서 호출 할 수 있습니다 내 C++/CLI 코드에서 방법을 선언해야 다음 :

class MyMathFuncs { 
public: 
[DllImport("TestDLL.dll")] 
    static double Add(double a, double b); 
}; 

"TestDLL.dll"은 내 DLL입니다.

오류는 런타임에 발생합니다. " 'TestDLL.dll'DLL에서 '추가'라는 항목을 찾을 수 없습니다."라는 메시지가 나타납니다.

내가 뭘 잘못하고 있니? 이것에 대한 MSDN 기사를 읽었지만 이해가되지 않습니다.

미리 도움 주셔서 감사합니다.

+0

비 관리 코드가 네임 스페이스에있는 클래스에 있지만 관리되는 C++ 코드에 주변 네임 스페이스가 없습니다. DLL에'MathFuncs :: MyMathFuncs :: Add'가있는 동안 관리되는 코드가'MyMathFuncs :: Add'를 찾는 것이 문제 일 수 있습니다. –

+0

왜 P/invoke를 사용합니까? C++/CLI의 멋진 기능 중 하나는 P/invoke없이 네이티브 DLL에 연결할 수 있다는 것입니다. –

답변

1

네이티브 DLL 용 DEF 파일을 만들었습니까?

DUMPBIN도 도움이 될 수 있습니다. DLL이 수출을 살펴보세요 :

+0

답변 해 주셔서 감사합니다. 연결된 MSDN 페이지에 따르면 __declspec (dllexport) 키워드를 사용하면 DEF 파일이 필요하지 않습니다. Dumpbin으로 내가 뭘할지 모르겠습니다. – JonaGik

0

를 해결. DLL의 DllImport 특성에 함수의 EntryPoint를 포함해야합니다. 그러나 MSDN 설명서에 EntryPoint DLL의 함수 이름이 될 수 있지만 나에게 적합하지 않습니다 제안합니다 - 나는 함수의 서수 번호를 명시해야합니다. 아무도 내가 왜 이것을 알 수 있습니까?

+0

이름 맹 글링 또는 이름 장식으로 인해. 종속성 뷰어 같은 DLL에서 내 보낸 이름을 확인하십시오. 그것이 다른 답변이 얻는 것입니다. 그러나 LemonBeagle이 맹 글링과 장식을 명시 적으로 언급했다면 더 좋았을 것입니다. –

관련 문제