2008-10-01 4 views
7

내가로 정의 된 기본 DLL에서 함수를 호출은 다음과 "문자열"클래스 (MFC에서 생각하는 것)?원수 C++에서 "문자열"클래스/

다양한 형식 (C# String, char [], byte [])으로 마샬링을 시도했지만 NotSupportedException 또는 네이티브 어셈블리 예외가 발생할 때마다 (시도한 마샬링에 따라)

기본 문자열 클래스가 사용되는 네이티브/관리 Interop을 만든 사람은 누구입니까? 이 방법을 마샬링 할 수 있습니까? 내 마샬 러를 써야 하나?

+0

큰 질문; 나는 그것이 자동적으로 작동하지 않는다는 것에 놀랐다. http://msdn.microsoft.com/en-us/library/1b4az623.aspx –

+0

나는 너무 놀랐다 ... 중요한 이유가 없다. ... 그러나 STL이 그걸로 작동하지 않을 것 같다. ... 또한 ... WCHAR을 사용하는 함수를 변경 하겠지만 변경할 수있는 DLL이 아닙니다. –

답변

6

C++ 표준 라이브러리 문자열 클래스를 사용하려는 것 같습니다. 나는 그것이 육군 원수에게 쉽지 않을지 의심 스럽다. char * 및 Marshal을 StringBuilder로 사용하는 것이 더 좋습니다. 그게 내가 보통하는 일이야. C++ 문자열을 생성하는 래퍼를 추가해야합니다.

+0

나는 두려웠다 ... 인물들 –

2

PInvoke interop assistant는 C++ C++ 만 지원합니다. 불행히도 MFC String 클래스 (CString은 무엇을 믿을 까?)는 C++이며 보조자를 통해 작동하지 않습니다. 대신 다음

void SetPath(__in const WCHAR* path); 
0

예 사용해보십시오. 할 수있어. 실제로 std::string, std::wstring뿐만 아니라 모든 표준 C++ 클래스 나 자신의 클래스를 C#/.NET에서 마샬링하거나 인스턴스화하여 호출 할 수 있습니다.

.NET에서 C++ 객체를 인스턴스화하는 기본적인 개념은 .NET에서 C++ 객체의 정확한 크기를 할당 한 다음 C++ DLL에서 내 보낸 구성자를 호출하여 객체를 초기화하는 것입니다. 이 C++ 객체에 액세스하기 위해 함수를 호출하는 경우 다른 C++ 클래스와 관련된 메서드가 있으면 C# 클래스로 래핑해야합니다. 기본 유형의 메서드는 간단히 P/Invoke 할 수 있습니다. 전화 할 방법이 몇 가지 밖에 없다면 간단 할 것이고 수동 코딩은 오래 걸리지 않을 것입니다. C++ 객체로 끝내면 C++ 객체의 소멸자 메서드를 호출합니다.이 함수는 또한 내보내기 함수이기도합니다. 하나도 없으면 .NET에서 메모리를 해제하면됩니다.

다음은 예입니다.

public class SampleClass : IDisposable 
{  
    [DllImport("YourDll.dll", EntryPoint="ConstructorOfYourClass", CharSet=CharSet.Ansi,   CallingConvention=CallingConvention.ThisCall)] 
    public extern static void SampleClassConstructor(IntPtr thisObject); 

    [DllImport("YourDll.dll", EntryPoint="DoSomething", CharSet=CharSet.Ansi,  CallingConvention=CallingConvention.ThisCall)] 
    public extern static void DoSomething(IntPtr thisObject); 

    [DllImport("YourDll.dll", EntryPoint="DoSomethingElse", CharSet=CharSet.Ansi,  CallingConvention=CallingConvention.ThisCall)] 
    public extern static void DoSomething(IntPtr thisObject, int x); 

    IntPtr ptr; 

    public SampleClass(int sizeOfYourCppClass) 
    { 
     this.ptr = Marshal.AllocHGlobal(sizeOfYourCppClass); 
     SampleClassConstructor(this.ptr); 
    } 

    public void DoSomething() 
    { 
     DoSomething(this.ptr); 
    } 

    public void DoSomethingElse(int x) 
    { 
     DoSomethingElse(this.ptr, x); 
    } 

    public void Dispose() 
    { 
     Marshal.FreeHGlobal(this.ptr); 
    } 
} 

상세 내용은 아래 링크를 참조하시기 바랍니다

,

C#/.NET PInvoke Interop SDK

(필자는 SDK 도구의 저자)

당신이 당신의 C에 대한 C#을 래퍼 클래스를 일단 ++ .NET에서 C++ 객체를 마샬링 할 수 있도록 ICustomMarshaler을 쉽게 구현할 수 있습니다.

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.icustommarshaler.aspx