2012-01-05 3 views
4

나는 C++에서 메소드를 호출하는 법을 배우고있다. 나는 약간의 연구를했고 Pinvoke는 좋은 방법 인 것 같습니다.C#에서 DLL로 사용하도록 C++ 코드를 어떻게 변경합니까?

나는 그것이 C#에서 호출 할 수 있도록해야하고, 어떻게 C#에서 호출 할 수있는 방법을 쓸 수있는 방법을 방법이 간단한 C++ 코드를 번역 할 수있는 방법

?

namespace MathFuncs 
{ 
    class MyMathFuncs 
    { 
     public:    
     double Add(double a, double b); 
     MyMathFuncs getClass(); 
    }; 
} 

C#에서 MathFuncsLib.cpp

#include "MathFuncsLib.h" 
namespace MathFuncs 
{ 
    MyMathFuncs MyMathFuncs::getClass() { 
     return *(new MyMathFuncs()); 
    } 

    double MyMathFuncs::Add(double a, double b) { 
     return a + b; 
    } 
} 

가 싶습니다

가 가지고

MathFuncsLib.h :

나는 헤더 파일이

main() 
{ 
    MyMathFuncs abd = MyMathFuncs::getClass(); 
    abd.Add(1.2, 2.3); 
} 

나는 그것이 어떻게 달성되어야하는지 전혀 모른다. 그래서 나는 그것에 대해 물어 보는 것이 더 낫다고 생각한다.

+0

흥미로운 질문입니다. 나는 그것을 달성 할 수 있을지 확신하지 못한다. (이름 짓기는 클래스를 내보내기의 기본 전제뿐만 아니라 극복하는 것이 어려울 것이다.) 나는 이런 일이 어떻게 될지 모르지만, P/Invoke와 C++/CLR의 조합으로 나타냅니다. 블로그 게시물 [쉘이 C++로 작성된 경우 기본 클래스를 내 보내지 않는 이유는 무엇입니까?] (http://blogs.msdn.com/b/oldnewthing/archive/2011/10/24/10229097.aspx) Raymond The Old New Thing의 Chen은 또한 당신에게 흥미있을 것입니다. –

+0

Pinvoke는 클래스를 호출하려는 것이 아닙니다. 그렇게하려면 C++/CLI를 사용하는 것이 가장 좋습니다. –

+0

그게 어떤 방식이든, 두 가지 샘플을 제공 할 수 있습니까? – olidev

답변

7
: 당신이 당신의 생성자는 개인하고 클래스의 인스턴스를 얻기 위해 모두 getClass 사용하려면

main() 
{ 
    MyMathFuncs abd = new MyMathFuncs(); 
    abd.Add(1.2,2.3); 
} 

, 당신은 같은 그 방법은 정적해야한다

정적 함수가 많은 경우 P/Invoke가 더 적합합니다. 대신 C++/CLI을 사용할 수 있습니다. 이는 C++ 클래스 세트 또는 클래스의 구조화 된 도메인 모델 계층 구조를 가질 때 더 적합합니다.

.H :

namespace MathFuncs { 

    public ref class MyMathFuncs 
    { 
     public:    
      double Add(double a, double b); 
    }; 
} 

.CPP :

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

.CS : 당신으로

static class Program 
{ 
    static void Main() 
    { 
     MyMathFuncs abd = new MyMathFuncs(); 
     abd.Add(1.2, 2.3); 
    } 
} 

이것은 당신이 샘플 함께 할 수있는 방법입니다 C++/CLI와 마찬가지로 getClass 함수가 필요 없으므로 MathFuncs 클래스는 완전한 .NET 클래스가됩니다.

편집 : 당신이 관리되지 않는 코드에서 발생하는 (샘플에서 A + B) 실제 계산을하려는 경우, 당신은 이런 식으로 그것을 할 수; 예를 들면 :

.H :

namespace MathFuncs { 

    public ref class MyMathFuncs 
    { 
     public:    
      double Add(double a, double b); 
    }; 

    class MyMathFuncsImpl 
    { 
     public:    
      double Add(double a, double b); 
    }; 
} 

.CPP :이 경우

namespace MathFuncs 
{ 
    double MyMathFuncs::Add(double a, double b) { 
     MyMathFuncsImpl *p = new MyMathFuncsImpl(); 
     double sum = p->Add(a, b); 
     delete p; 
     return sum; 
    } 

#pragma managed(push, off) 
    double MyMathFuncsImpl::Add(double a, double b) { 
     return a + b; 
    } 
#pragma managed(pop) 
} 

이 MyMathFuncsImpl이 :: 네이티브 코드로 생성되는 추가, IL로 (C 번호에서 전화하지 는 똑같은). 관리 코드와 비 관리 코드를 혼합하는 방법에 대한 자세한 내용은 여기 : managed, unmanaged을 참조하십시오.

+0

수학 계산은 실수로 끝나지 않을 것입니다. 따라서 수학 최적화를 위해 C++을 사용한다면 클래스에서 아웃소싱해야합니다. 나는 이것이 여기서 문제가 아니라는 것을 알고 있지만 나는 단지 그것을 언급 할 것이라고 생각했다. – Zenexer

+0

@Zenexer - 좋은 지적, 나는 나의 대답을 업데이트했다. –

+0

와우, 아주 차가워 요. 나는 당신이 관리되고 관리되지 않는 것에 대한 많은 통제력을 가지고 있다는 것을 전혀 모릅니다. 적어도, 그렇게는 아닙니다. – Zenexer

0

yor 생성자가 private이 아닌 한 get 클래스를 사용할 필요가 없습니다. 그것은 대중이 좋아 사용 경우

namespace MathFuncs 
{ 
    class MyMathFuncs 
    { 
     public double Add(double a, double b); 
     static MyMathFuncs getClass() { return new MyMathFuncs(); } 
    }; 
} 
+1

pinvoke 및 interop 문제를 무시하는 것 같습니다. C# 코드에서 C++ 함수를 호출하려면 어떻게해야할까요? –

+0

@Sffix : 그것을 만들고 싶습니다 : MyMathFuncs abd = MyMathFuncs :: getClass(); C++의 객체가 C#에서 어떻게 검색되는지 이해하기 위해서. – olidev

+0

@DavidHeffernan : 네 말이 맞아, 내 실수 야. – Seffix

0

C++/cli 또는 managed C++에서 정의 된 클래스 주위에 래퍼 클래스를 추가하십시오.그것은 네이티브 C++과 C# 모두와 직접 대화 할 수있는 레이어와 같습니다.

0

Microsoft Visual Studio (Express)를 사용하여 보통 (예 : main() 함수없이) 클래스를 만들었지 만 .dll으로 컴파일하도록 선택할 수 있습니다 . 이점은 클래스가 개발중인 다른 응용 프로그램에서 재사용/호출 될 수있는 별도의 파일에 있다는 점입니다.

관련 문제