예 사용해보십시오. 할 수있어. 실제로 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
큰 질문; 나는 그것이 자동적으로 작동하지 않는다는 것에 놀랐다. http://msdn.microsoft.com/en-us/library/1b4az623.aspx –
나는 너무 놀랐다 ... 중요한 이유가 없다. ... 그러나 STL이 그걸로 작동하지 않을 것 같다. ... 또한 ... WCHAR을 사용하는 함수를 변경 하겠지만 변경할 수있는 DLL이 아닙니다. –