C# dll with VC
어떻게 C#의 클래스를 VC에서 어떻게 쓸까.
1. C#에서 클래스를 만든다.
1.1 C# 클래스를 만든다.
(프로젝트 속성 -> 구성 속성 -> 빌드 -> COM Interop 등록을 true로 해주면 1.4을 안해도 됨. 그러나 어짜피 다른 컴퓨터에서 한번은 해주어야 함 -_ -)
ClassLibrary1.cs
using System;
using System.Runtime.InteropServices;
namespace ClassLibrary1
{
[ClassInterface(ClassInterfaceType.AutoDual)]
public class Class1
{
...
}
public SayHello()
{
//do something..
}
}
1.2 생성된 파일을 AssemblyInfo.cs의 맨 밑에 추가하여 준다.
C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin\sn -k ClassLib.snk
[assembly: AssemblyKeyFile("./ClassLibrary1.snk")]
1.3 빌드
... -_ -
1.4 어샘블리를 등록한다.
regasm /tlb:ClassLibrary1.tlb ClassLibrary1.dll /codebase
2.1 VC 코드를 생성한다.
#import "../Dll/mscorlib.tlb" raw_interfaces_only
using namespace mscorlib;
#import "../Dll/ClassLibrary1.tlb"
using namespace ClassLibrary1;
int main()
{
CoInitialize(0);
_Class1Ptr class1(__uuidof(Class1));
class1->SayHello()
CoUninitialize();
return 0;
}
ps1. MessageBox와 같은 Form이 들어갈 경우 메모리 릭이 발생한다. 왜? -_ -
ps2. 클래스가 System.Windows.Forms.Form을 상속받을경우 VC에서 못부른다.. 왜? - _-
ps3. Com의 메소드로 부터 값(문자열)을 돌려받고 싶으면 out 을 쓰자.
C#
public void MethodName(out String outString)
{
...
}
VC
BSTR outString = 0;
HRESULT hResult = class1->MethodName(&outString);
if ( hResult == S_OK )
{
// 값을 잘 가져왔군!!
}
// 메모리 해제를 해주어야 함 -_ -
USES_CONVERSION;
CString res = OLE2CA(outString);
참조 링크: http://groups.google.com/group/microsoft.public.dotnet.languages.vc/browse_frm/thread/6bfd1115e804cc58/e6ce1ba6326bc680?q=group:microsoft.public.dotnet.languages.vc+insubject:system.xml.schema