문제

다음과 같이 정의 된 기본 DLL에 기능이 있습니다.

#include <string>
void SetPath(string path);

나는 이것을 Microsoft의 P/Invoke Interop Assistant에 넣으려고 노력했지만 "String"클래스에서 질식합니다 (MFC에서 생각합니까?).

나는 그것을 다양한 유형 (c# string, char [], byte [])로 마샬링하려고 시도했지만, 지원되지 않은 외환 또는 기본 어셈블리 예외를 얻을 때마다 (내가 시도한 마샬링에 따라).

네이티브 스트링 클래스가 사용되는 곳에서 기본/관리자 인터 로프를 해본 적이 있습니까? 이것을 마샬링하는 방법이 있습니까? 내 마샬러를 써야할까요?

도움이 되었습니까?

해결책

C ++ 표준 라이브러리 문자열 클래스를 사용하려고하는 것 같습니다. 나는 그것이 마샬링하기가 쉬울 것이라고 의심합니다. 숯 *과 마샬을 StringBuilder로 고수하는 것이 좋습니다. 그것이 내가 보통하는 일입니다. C ++ 문자열을 생성하는 래퍼를 추가해야합니다.

다른 팁

Pinvoke Interop Assistant는 C ++가 아닌 C 만 지원합니다. 불행히도 MFC 문자열 클래스 (Cstring I Believe?)는 C ++이며 조수를 통해 작동하지 않습니다. 대신 다음을 사용해보십시오

void SetPath(__in const WCHAR* path);

예. 당신은 할 수 있습니다. 사실,뿐만 아니라 std::string, std::wstring, 모든 표준 C ++ 클래스 또는 자신의 클래스는 C#/. Net에서 마샬링되거나 인스턴스화되어 호출 될 수 있습니다.

.NET World에서 C ++ 객체를 인스턴스화하는 기본 아이디어는 .NET에서 C ++ 객체의 정확한 크기를 할당 한 다음 C ++ DLL에서 내보내는 생성자를 호출하여 객체를 초기화 한 다음 중 하나를 호출 할 수 있습니다. 해당 C ++ 객체에 액세스하는 기능 (메소드에 다른 C ++ 클래스가 포함 된 경우 C# 클래스로 래핑해야합니다. 원시 유형의 메소드를 위해서는 간단히 P/호출 할 수 있습니다. 전화 할 방법이 몇 개 밖에 없다면 간단하고 수동 코딩이 오래 걸리지 않습니다. 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# 래퍼 클래스가 준비되면 구현하기 쉽습니다. ICustomMarshaler .NET에서 C ++ 객체를 마샬링 할 수 있습니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top