19.1C# 언어 지원
C#에서도 ProudNet을 사용하실 수 있도록 저희는 Native ( C++ ) 모듈들을 SWIG로 Wrapping하여 제공해드리고 있습니다. 물론 4. Remote Method Invocation (원격 메서드 호출)을 위한 PIDL 컴파일러도 C# 언어로 된 proxy와 stub을 생성해줍니다. 따라서 RMI 기능을 포함해서 C# 으로 만들어진 응용 프로그램 개발이 가능합니다.
C# 프로젝트 만들기
생성하신 C# 프로젝트가 ProudNet을 사용할 수 있게 하시려면, 하기 링크의 페이지에 나와있는대로 dll 파일들을 셋팅하신 뒤에 클라이언트의 경우 ProudDotNetClient.dll을 서버의 경우 ProudDotNetClient.dll과 ProudDotNetServer.dll을 reference에 추가하시면 됩니다.
http://guide.nettention.com/csharp_ko#dotnetframeworkdll
ProudNet은 DotNet Framework 프로젝트뿐만 아니라 DotNet Core 프로젝트로도 서버와 클라이언트를 개발하실 수 있습니다. ProudNet을 사용하는 DotNet Core 프로젝트가 리눅스에서도 구동되어지게 만드는 방법은 아래 링크의 페이지를 참조부탁드리겠습니다.
http://guide.nettention.com/csharp_ko#linuxdotnetcoreserver
생성하신 C# 프로젝트가 ProudNet을 사용할 수 있게 셋팅을 완료하셨다면,
아래 링크 페이지의 '사용법 도움말 for C#'을 참고하시면서 ProudNet을 C#에서 사용하시면 됩니다.
http://guide.nettention.com/csharp_ko
더불어 아래 링크에 나와있는 C# 언어 지원 예제도 참고해주시면 감사하겠습니다.
C# 언어 지원 예제는 12. ProudNet을 C# 에서 사용하는 예제 프로그램에 있습니다.
C# 에서 PIDL 컴파일러 사용하기
C# 언어에서도 4. Remote Method Invocation (원격 메서드 호출)을 사용할 수 있습니다. 그리고 이를 위해 PIDL compiler도 C# 언어의 proxy와 stub 코드를 생성합니다.
다음과 같이 실행하면 C# 언어의 proxy와 stub 코드가 생성됩니다. (기존 -clr은 -cs와 동일합니다.)
PIDL.exe -cs <input-file-name>
응용 프로그램을 개발하다 보면 서버와 클라이언트가 공통으로 쓰는 모듈이 존재하기 마련입니다. C# 언어로 만들어지는 proxy와 stub은 여기에 들어가는 것이 적당합니다.
그리고 이 모듈에는 11.2 PIDL 컴파일러 실행하기 에서와 마찬가지로 C# 프로젝트에서도 PIDL 파일을 입력받아 커스텀 빌드를 해줄 필요가 있습니다. 이는 다음과 같이 합니다.
그림 19-1C# 프로젝트에서 PIDL 파일을 위한 커스텀 빌드 설정하기
C2S.pidl을 빌드 후 생성되는 proxy,stub은 다음과 같습니다.
C2S_common.cs C2S_proxy.cs C2S_stub.cs
이들 파일을 C# 프로젝트(.csproj)에 포함시키십시오. 단, 이들 파일은 빌드 결과물이지, 사용자가 작성하는 순수한 의미의 소스가 아닙니다. 그러므로 소스 컨트롤(가령 SVN 등)에는 넣지 말아야 합니다. 안그러면 읽기전용 파일에 쓰기 오류가 날 수 있습니다.
.csproj 파일을 편집기로 열어 다음과 같이 수정하는 것을 권장합니다.
<Target Name="BeforeBuild"> <ItemGroup> <Compile Include="C2S_common.cs" /> <Compile Include="C2S_proxy.cs" /> <Compile Include="C2S_stub.cs" /> </ItemGroup> </Target> <Target Name="AfterBuild"> </Target>
C# 언어로 생성된 proxy와 stub은 C++에서의 경우와 똑같은 이름의 클래스입니다. (11.3 RMI proxy와 stub을 연결하기 참고) 사용법 또한 C++의 경우와 동일합니다.
자세한 것은 12. ProudNet을 C# 에서 사용하는 예제 프로그램의 Common 모듈 소스를 참고하십시오.
C# 언어에서 사용자 정의 타입을 마샬링하기
RMI의 파라메터에 사용자 정의 객체 타입을 방법은 2. PIDL 파라메터 타입 다루기(마샬링)에 나와있습니다. C# 언어 또한 이것이 가능합니다.
C#에서의 마샬링 방법은 하기 링크의 페이지 내용을 참고부탁드리겠습니다.
http://guide.nettention.com/csharp_ko#marshalling
RMI proxy, stub 클래스의 public, internal, private 설정하기
PIDL compiler가 생성하는 proxy, stub, common 클래스의 억세스 한정자는 기본적으로 internal이 설정됩니다. 즉 이들 클래스는 같은 모듈(혹은 어셈블리) 내 다른 소스에서 사용될 수는 있지만 다른 모듈에서는 사용될 수 없습니다.
하지만 이들 클래스들을 모아놓은 모듈을 따로 빌드하고 이 모듈에 있는 이들 클래스들을 다른 모듈에서도 사용하고자 할때는 억세스 한정자를 public으로 바꾸고 싶으실 수 있습니다.
이러한 경우 PIDL compiler가 생성하는 클래스의 억세스 한정자 속성을 다음과 같이 설정하세요.
// This will let proxy, stub and common classes to have access modifier 'public'. [marshaler(clr)=MyMarshaler, access=public] global MyC2S 3000 { Foo(...); }
C#, C++ 언어로 된 프로그램간 통신하기
19.2 이종 언어로 된 프로그램간 통신하기를 참고하십시오.
19.2이종 언어로 된 프로그램간 통신하기
두 프로그램이 ProudNet으로 통신하되 서로 다른 프로그래밍 언어로 만들고 싶을 때가 있습니다. 이러한 경우 PIDL compiler는 두 개 이상의 언어로 된 proxy와 stub을 생성한 후 각 프로그램은 필요한 것을 가져다 쓰면 됩니다.
int, double, string 등 기본 타입에 대해서는 ProudNet의 C++ 외의 언어를 위한 래핑 모듈에서 이미 제공하고 있습니다. 하지만 언어가 서로 다르면 이러한 기본 타입의 이름이 기본적으로 달라지기 마련입니다. 예를 들어 C# 은 문자열 클래스가 System.String 인데, C++에서는 std::string , std::wstring, ATL::CString , Proud::String입니다.
이를 해결하기 위해 PIDL compiler는 사용자가 원할 경우 생성되는 proxy,stub에서 변수 타입을 특정 언어에 한해서 변경하는 기능을 제공하고 있습니다. 아래는 사용 예입니다.
// C# 언어의 proxy,stub 생성시 TypeA를 TypeB로 개명합니다. rename cs(TypeA,TypeB); // C++ 언어의 proxy,stub 생성시 TypeC를 TypeD로 개명합니다. rename cpp(TypeC,TypeD); global XXX 2000 { Foo([in]TypeA a); // C# 언어로 proxy,stub 생성시 Foo(TypeB a) 가 됩니다, Goo([in]TypeC c); // C++ 언어로 proxy,stub 생성시 Goo(TypeD c) 가 됩니다. }