C# & .NET
.NET의 Delegate를 관리되지 않는 코드(VC++모듈)에 전달하기
iwoohaha
2008. 8. 11. 12:25
반응형
[필요한 상황]
.NET 모듈과 VC++ 관리되지 않는 코드로 작성된 모듈의 연결
VC++ 관리되지 않는 코드로 작성된 모듈에서 특정 시점에 .NET 모듈에 정의된 delegate를 호출해야 하는 상황
.NET 모듈에서 VC++ 관리되지 않는 코드로 작성된 모듈의 export API 호출을 통해서 .NET 모듈의 delegate를 전달.
[VC++ 관리되지 않는 코드로 작성된 모듈]
VC++ 관리되지 않는 코드로 작성된 모듈에서 필요로 하는 함수 포인터 형식
typedef void (CALLBACK *TextSelectionChangedHandlerProc)(void);
위 형식의 함수포인터를 저장하기 위한 클래스 멤버 변수
TextSelectionChangedHandlerProc m_pTextSelectionChangedHandlerProc;
위 형식의 함수포인터를 VC++ 관리되지 않는 코드로 작성된 모듈에 설정하기 위한 API
extern "C" _MYEDITOR_API void SetTextSelectionChangedHandler(HWND hWnd, TextSelectionChangedHandlerProc func);
[.NET 모듈]
VC++ 관리되지 않는 코드로 작성된 모듈에서 특정 시점에 호출하게 될 함수
public class FormMyEditor
{
....
private void TextSelectionChanged()
{
....
}
....
}
[VC++ 관리되지 않는 코드로 작성된 모듈로 전달할 델리게이트]
public delegate void TextSelectionChangedHandler();
public class FormMyEditor
{
....
private TextSelectionChangedHandler _delegateTextSelectionChanged = null;
private void FormMyEditor_Load(object sender, EventArgs e)
{
_delegateTextSelectionChanged = new TextSelectionChangedHandler(TextSelectionChanged);
// VC++ 모듈의 export API 호출
CMyEditorAPI.SetTextSelectionChangedHandler(_delegateTextSelectionChanged);
}
}
[VC++ 모듈에 대한 C# 라이브러리]
public class CMyEditorAPI
{
[DllImport("MyModule.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void SetTextSelectionChangedHandler(IntPtr hWnd, [MarshalAs(UnmanagedType.FunctionPtr)]TextSelectionChangedHandler proc);
}
.NET 모듈과 VC++ 관리되지 않는 코드로 작성된 모듈의 연결
VC++ 관리되지 않는 코드로 작성된 모듈에서 특정 시점에 .NET 모듈에 정의된 delegate를 호출해야 하는 상황
.NET 모듈에서 VC++ 관리되지 않는 코드로 작성된 모듈의 export API 호출을 통해서 .NET 모듈의 delegate를 전달.
[VC++ 관리되지 않는 코드로 작성된 모듈]
VC++ 관리되지 않는 코드로 작성된 모듈에서 필요로 하는 함수 포인터 형식
typedef void (CALLBACK *TextSelectionChangedHandlerProc)(void);
위 형식의 함수포인터를 저장하기 위한 클래스 멤버 변수
TextSelectionChangedHandlerProc m_pTextSelectionChangedHandlerProc;
위 형식의 함수포인터를 VC++ 관리되지 않는 코드로 작성된 모듈에 설정하기 위한 API
extern "C" _MYEDITOR_API void SetTextSelectionChangedHandler(HWND hWnd, TextSelectionChangedHandlerProc func);
[.NET 모듈]
VC++ 관리되지 않는 코드로 작성된 모듈에서 특정 시점에 호출하게 될 함수
public class FormMyEditor
{
....
private void TextSelectionChanged()
{
....
}
....
}
[VC++ 관리되지 않는 코드로 작성된 모듈로 전달할 델리게이트]
public delegate void TextSelectionChangedHandler();
public class FormMyEditor
{
....
private TextSelectionChangedHandler _delegateTextSelectionChanged = null;
private void FormMyEditor_Load(object sender, EventArgs e)
{
_delegateTextSelectionChanged = new TextSelectionChangedHandler(TextSelectionChanged);
// VC++ 모듈의 export API 호출
CMyEditorAPI.SetTextSelectionChangedHandler(_delegateTextSelectionChanged);
}
}
[VC++ 모듈에 대한 C# 라이브러리]
public class CMyEditorAPI
{
[DllImport("MyModule.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void SetTextSelectionChangedHandler(IntPtr hWnd, [MarshalAs(UnmanagedType.FunctionPtr)]TextSelectionChangedHandler proc);
}
반응형