2010-06-23 5 views
8

하나의 C# 프로젝트가있는 솔루션이 있습니다. SomeComp.Framework는 이름입니다. F # 프로젝트를 솔루션에 추가합니다. F # 프로젝트에서 SomeComp.Framework 프로젝트를 참조합니다. F # 프로젝트에 test.fsx라는 스크립트 파일을 삽입합니다. 스크립트 파일에서 C# 어셈블리를 참조하는 올바른 방법은 무엇입니까?F #x/C# - fsx 스크립트 파일 및 프로젝트 참조

#r "SomeComp.Framework.dll" // doesn't work 

경로를 하드 코딩하지 않고도이를 수행 할 수있는 방법이 있습니까? .fsx 파일은 F # 프로젝트 내에있는 모든 설정/속성을 가져 옵니까?

답변

15

아니요, 프로젝트에서 설정을 가져 오지 않았으므로 경로를 하드 코딩해야합니다. (이것은 향후 릴리스에서 개선 될 시나리오입니다.) 'Debug'경로 대 'Release'경로에도주의하십시오.

#r "EnvDTE" 
#r "EnvDTE80" 
#r "VSLangProj" 

let appObj = System.Runtime.InteropServices.Marshal. 
       GetActiveObject("VisualStudio.DTE") :?> EnvDTE80.DTE2 
let solnDir = System.IO.Path.GetDirectoryName(appObj.Solution.FileName) 
let cfg = appObj.Solution.SolutionBuild.ActiveConfiguration.Name 
let libraryDLLPath = System.IO.Path.Combine 
         [| solnDir; "Library1"; "bin"; cfg |] 

//#r libraryDLL // illegal, since #r takes a string literal, but... 

let props = appObj.Properties("F# Tools", "F# Interactive") 
let cla = props.Item("FsiCommandLineArgs") 
cla.Value <- sprintf "--optimize -I:\"%s\"" libraryDLLPath 

appObj.ExecuteCommand("View.F#Interactive", "") 
appObj.ExecuteCommand("OtherContextMenus.FSIConsoleContext.ResetSession", "") 

#r "Library1.dll" 

두 조각, 마지막 줄하지만 먼저 모든 것을, 그리고 마지막으로 마지막 줄이 실행 :

편집

좋아, 와우, 나는 유용한 무언가를 알아 냈어. 기본적으로 VS 내부의 FSI 설정을 변경하고 세션을 재설정하므로 나중에 경로없이 #r "MyLibrary.dll"을 사용할 수 있습니다.

거대한 해킹이지만 일부 사람들이 유용하다고 생각하는 것처럼 보이므로 공유하고 있습니다.

+0

스크립트는 실행중인 위치에서 픽업 할 수 있습니까? 그거 좋을거야. – BuddyJoe

+1

시스템에서 실행중인 VS의 인스턴스가 두 개 이상인 경우이 메쏘 프가 문제가 될 수 있습니다. –

+0

매우 근사합니다. 감사. upvotes – BuddyJoe