Roslyn에서 ShadowCopy 서비스 사용하기

어떤 분께서 질문하셔서, 간단하게 답변 드렸는데, 주말에 시간나서 블로그로 좀 더 자세히 답변 드릴려고 합니다.

* 여기서 한가지 짚고 넘어갈 것은 밑에 설명은 final 한 API에 대한 것이 아니기 때문에, 마지막 버젼에서는 아예 없어질수도 완전히 바뀔수도 있음을 알려드립니다.

 

일단, 여기에 써 있는 여러 layer 중에 compiler layer (API) 만 쓰실 경우, reference들의 shadow copy를 원하시면 직접 구현 하셔야 합니다. 이 layer에선 AssemblyFileReference 를 만드실 경우 FileShare.Read 와 FileShare.Delete을 이용하여, 주신 파일 그 자체를 open 합니다. 따라서 당연히 수정 이런게 안되죠. 이게 중요한 이유는 만약 VS에서 컴파일 되는 live dlls 들을 reference 해서 뭔가 실시간 분석 프로그램을 만들 경우, 계속 그 reference들을 가지고 있는 한, VS에서 그 파일들을 다시 만들수가 없습니다.

 

그럼 그럴경우 어떻게 해야 하느냐, 이럴때 필요한게 shadow copy인데, 이걸 뭐 직접 구현 하셔도 되고, 아니면 Workspace Layer(API)에서 제공하는 shadow copy service를 이용하셔도 됩니다.

 

위에 글에 있다시피, 이번에 공개된 Roslyn은 여러 부분을 커버 하는데, 코드 자체에 대한 정보만을 제공하는 compiler API, 이것을 이용해서 scripting 환경을 구현하는 Script API, 코드에 대한 정보를 좀 더 high level (추상화된 상태)로 관리해 주는 Workspace API, 그리고 이런 정보들을 이용하여 좀 더 구체적인 service를 제공하는 Service API 이렇게 됩니다. 이 중에 Workspace 단에서 바로 이 shadow copy 를 맡게 됩니다.

 

Workspace 단은 다시 Host 쪽에서 제공해야 기능들을 위한 API와 consumer 쪽에서 사용하는 API로 나뉩니다. 이 shadow copy는 바로 Workspace Host 단에서 제공해줘야 하는 서비스 입니다. 그 서비스는 Rolsyn.Services.Host.IWorkspaceService 라는 메카니즘을 이용하고, shadow copy를 제공하는 서비스는 Roslyn.Services.Host.IMetadataFileProviderService 라는 interface를 implement 하게 됩니다.

 

로즐린에 들어있는 가장 basic implementation은 shadow copy를 제공하지 않는것입니다. VS에 들어있는 방법은 아주 간단한 shadow copy 기능을 제공하는것이죠. 현재로 이미 Host에서 제공된 이 서비스를 override 하실 방법은 없습니다. 하지만, 본인이 직접 Roslyn.Services.Host.HostWorkspace 를 상속해서 자신만의 Workspace를 만들 경우, 자신이 원하는 IMetadataFileProviderService를 제공함으로써 Shadow Copy 를 이용하실순 있습니다.

 

자신만의 Workspace + Shadow Copy 를 원할 경우, 정말 간단하게 shadow 카피만을 원하신다면, Roslyn.Scripting.AssemblyShadowCopyProvider 라는 Scripting 쪽에서 기본으로 제공하는 서비스를 그냥 재사용하셔도 무방할것으로 보입니다.

 

여기 내용 중 더 자세하게 알고 싶으신 부분을 말씀해 주시면 또 블로그 포스팅 올리도록 하겠습니다.

 

수고.

- 희제