Languages/C, C++2012. 8. 17. 17:17

C# 에서 C++로 작성된 dll 을 사용할 경우에는 DllImport 를 사용하여 손쉽게 사용할 수 있지만

C++ 에서 C#으로 작성된 dll 을 사용할 경우에는 COM으로 등록하는 작업이 추가적으로 필요합니다.

사용법에 대해서 하나씩 살펴보겠습니다.

 

[ C# dll ]

 

1. C++에서 사용가능한 메소드를 노출시키기 위한 인터페이스를 선언합니다.

 

Tip

 

- Guid 는 Visual Studio의 [ Tools ] - [ Create GUID ] 메뉴를 통해 쉽게 만들 수 있습니다.

- [ComVisible(true)] 대신 다음과 같이 Make assembly COM-Visible을 체크할 수 있습니다.

 

[ComVisible(true)]

[Guid("61EA822A-82BC-4CCE-A0BF-5A24855FF613")]

public interface ICShapSample

{

    void ShowMessage();

}

 

2. 인터페이스를 상속받아 클래스를 구현합니다.

 

[ComVisible(true)]

[ClassInterface(ClassInterfaceType.None)]

[Guid("36EA856C-99E3-4365-B157-6C0D75173F48")]

public class CShapSample : ICShapSample

{

    public void ShowMessage()

    {

        MessageBox.Show("Hello World!!");

    }

}

 

3. dll 을 COM으로 등록합니다.

 

두 가지 방법이 있습니다.

 

1 ) Visual Studio를 관리자 권한으로 실행 시킨 후 다음과 같이 Register for COM interop을 선택한 후 빌드합니다.

 

 

2 ) 커맨드 창을 관리 권한으로 실행시 킨 후 regasm 을 이용해 등록합니다.

- 환경변수가 설정이 되어 있지 않으면

  C:\Windows\Microsoft.NET\Framework\v4.0.30319 ( 설치 버전에 따라 다름 )

  경로에 있는 RegAsm 과 regasm 파일을 dll 폴더에 복사합니다.

  커맨드 창에서 dll 폴더로 이동한 후,

  regasm ClassLibrary.dll /tlb 를 입력 후 실행합니다.

 

[ 등록이 완료되면 tlb 파일이 생성됩니다. ]

 

[ C++ ]

 

tlb 파일을 import 하여 사용합니다.

 

#include <Windows.h>

 

#import "..\ClassLibrary\bin\Debug\ClassLibrary.tlb"

 

using namespace ClassLibrary;

 

void main()

{

             CoInitialize(NULL);

 

             ICShapSamplePtr ptr(__uuidof(CShapSample));

             ptr->ShowMessage();

 

             ptr->Release();

             CoUninitialize();

}

 

[ 실행화면 ]

 

 

CShapDllImport.zip

 

Posted by 열ㅇl
Window/WPF2012. 8. 17. 15:07

VisualTree 를 순회하며 해당 타입과 이름이 일치하는 자식을 찾는 소스 코드입니다.

Template 에 유용하게 사용할 수 있습니다.

 

public static T FindChild<T>(this FrameworkElement obj, string name)

{

    DependencyObject dObj = obj as DependencyObject;

    T findChild = default(T);

   

    if (dObj != null)

    {

        int childCount = VisualTreeHelper.GetChildrenCount(dObj);

 

        for (int i = 0; i < childCount; i++)

        {

            DependencyObject childObj = VisualTreeHelper.GetChild(dObj, i);

            FrameworkElement child = childObj as FrameworkElement;

 

            if (child.GetType() == typeof(T) && child.Name == name)

            {

                findChild = (T)Convert.ChangeType(child, typeof(T));

                break;

            }

 

            findChild = child.FindChild<T>(name);

 

            if (findChild != null) break;

        }

    }

 

    return findChild;

}

 

'Window > WPF' 카테고리의 다른 글

Pixel Shader Effect in WPF  (0) 2015.02.26
[ WPF ] Word Cloud  (0) 2014.02.23
데이터 바인딩 ( Data Binding )  (0) 2012.07.24
WPF Media Player ( Design. GomPlayer )  (0) 2012.03.12
Brush ColorAnimation  (0) 2011.06.22
Posted by 열ㅇl
Languages/C#2012. 8. 17. 14:27

Struct 를 Byte 로, Byte 를 Struct 로 변환하는 소스 입니다.

 

public static byte[] StructToByte(object obj)

{

    int size = Marshal.SizeOf(obj);

    byte[] arr = new byte[size];

    IntPtr ptr = Marshal.AllocHGlobal(size);

 

    Marshal.StructureToPtr(obj, ptr, true);

    Marshal.Copy(ptr, arr, 0, size);

    Marshal.FreeHGlobal(ptr);

    return arr;

}

 

public static T ByteToStruct<T>(byte[] buffer) where T : struct

{

    int size = Marshal.SizeOf(typeof(T));

 

    if (size > buffer.Length)

    {

        throw new Exception();

    }

 

    IntPtr ptr = Marshal.AllocHGlobal(size);

    Marshal.Copy(buffer, 0, ptr, size);

    T obj = (T)Marshal.PtrToStructure(ptr, typeof(T));

    Marshal.FreeHGlobal(ptr);

    return obj;

}

 

'Languages > C#' 카테고리의 다른 글

[ C# ] FTP  (4) 2013.02.26
[ C# ] Object To Byte, Byte To Byte  (0) 2013.02.26
[ C# ] Win32 API MouseEvent  (8) 2010.12.07
[ C# ] C# FTP Download  (3) 2010.07.21
[ C# ] Default Sound Device 변경하기  (0) 2010.07.19
Posted by 열ㅇl