2013-03-04 4 views
1

내 응용 프로그램은 C# (관리 코드)과 C++ (비 관리 코드)의 두 부분으로 나뉩니다. 두 부분은 서로를 자주 호출하며 대개 두 요소 사이에 문자열을 전달합니다. 나는 그것을하기에 가장 좋고 오류가없는 방법을 알고 싶다. 관리되지 않는 코드에 관리에서 전화, 내가 관리되지 않는 관리에서 문자열 작성기를 전달하는 데 사용하고 때 관리 코드와 비 관리 코드 간 호출

나는 두 부분

  1. 에 문제를 나누어 :

    [DllImport("SomeXYZ.dll")] 
    // enter code here 
    
    private void XYZ(string text) 
    { 
        StringBuilder builder = new StringBuilder(); 
        builder.Append(“Var1”); 
        FromManagedtoUnmanaged(builder); 
    } 
    

    C++ 코드 :

    extern "C" 
    { 
    int _declspec(dllexport) FromManagedtoUnmanaged(char* var1); 
    } 
    
  2. 비 관리 대상에서 관리 대상으로, giv 함수 포인터를 사용하고 있습니다. C에 C#을 기능의 개 기능 참조 ++ 기능 :

    C# 코드

    [DllImport("SomeXYZ.dll")] 
    public static extern void SetCallback(Callback fn); 
    public delegate void Callback(string text); 
    public Callback mInstance; 
    
    private void ABC(string text) 
    { 
        mInstance = new Callback(SomeFunctionName); 
        SetCallback(mInstance); 
    } 
    

    C++ 코드, 헤더 파일 :

    extern "C" 
    { 
    void __declspec(dllexport) __stdcall SetCallback(Callback handler); 
    void __declspec(dllexport) __stdcall SendReceiveMessage(char* arr1); 
    } 
    

    그리고 .cpp 파일에 :

    void __stdcall SetCallback(Callback handler1) { 
        Handler = handler1; 
    } 
    
    void __stdcall SendReceiveMessage(char* arr1) { 
        Handler(arr1); 
    } 
    
    void SendMsg(int SomeVar) 
    { 
        char *str; 
        str = new char[1024]; 
        sprintf(str, “<body>%d</body>”, SomeVar); 
        SendReceiveMessage(str); 
    } 
    
+0

정확한 질문은 무엇입니까? 파트 2는 어디에 있습니까? 내가 볼 수있는 한'StringBuilder'를 사용하지 않고'string'을 사용합니다. –

+0

@ZdeslavVojkovic 'FromManagedtoUnmanaged'의 구현에서 그는 보통 StringBuilder를 함수에 전달하지 않는다고 생각합니다. –

+0

저는 그렇게 생각하지 않습니다. 그것은 관리되지 않기 때문에'StringBuilder'를 사용할 수 없습니다. interop의 경우,'StringBuilder'는 대개 문자열이 불변이므로 문자열의 상태를 변경하는 함수로 보내집니다. –

답변

1

가벼운 C++/CLI 어셈블리를 만드는 것이 가장 좋습니다 둘 사이. 왜이 언어가 만들어 졌는가?

이 C++/CLI 계층은 어셈블리 참조로 C# 프로젝트에 원활하게 통합되며 .net 리소스와 마찬가지로 액세스 할 수 있으며 C++/CLI는 모든 원시 C++ 코드를 원활하게 호출 할 수 있습니다.

나는이 기술을 시도했기 때문에 C++ 코드를 C# 코드에 직접 호출하는 것을 중단했습니다.

C++/CLI에 관해 들어 본 적이없는 분은 here's a concise tutorial in pdf format입니다.

+0

글쎄, 그가 쓰는 것처럼 오류가 없으며 배포를 약간 더 복잡하게 만드는 메서드를 호출하기 위해 다른 어셈블리를 소개합니다. –

+0

@ ZdeslavVojkovic 맞아. 그에 따라 편집했습니다. 그러나, 내 경험상, ** 그것은 엉뚱한 함수명 **에서 실수하기 쉽고, 초보자와 초보자 프로그래머조차도 완전히 읽을 수 없다. C++/CLI가 게임에서 완전히 승리했다. 나에게. –

+0

일반 C 함수의 경우 이름 맹 글링은 문제가되지 않지만 기본 유형을 제외하고 올바른 매개 변수 유형과'[MarshalAs]'주문을 선택하면 매우 오류가 발생하기 쉽다는 점에 동의합니다. –