2010-06-23 15 views
8

İçinde bir C# projesi bulunan bir çözüm var. SomeComp.Framework adıdır. Çözümüne bir F # projesi eklersiniz. F # projesinde SomeComp.Framework projesine başvurursunuz. F # projesine bir komut dosyası - test.fsx eklersiniz. Komut dosyasındaki C# derlemesine başvurmanın doğru yolu nedir?F #/C# - fsx Komut Dosyası Dosyaları ve Proje Referansları

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

bir yol hardcoding olmadan bunu yapmanın bir yolu var mı? .fsx dosyası, bir F # projesinin içine yerleştirilmek üzere herhangi bir ayar/özellik almıyor mu?

cevap

15

Hayır, projeden herhangi bir ayar almıyor, yolu kodlamanız gerekiyor. (Bu, gelecekteki bir sürüm için geliştirmeye bakacağımız bir senaryo.) 'Hata Ayıklama' ya da 'Sürüm' yollarına da dikkat edin.

#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" 

iki parçacıkları, son satırı ancak ilk şeyi ve nihayet son satır olarak bu yürütün:

DÜZENLEME

Tamam, vay, işe yarar bir şey anladım. Temel olarak, FSI ayarlarınızı VS içinde değiştirir ve oturumu sıfırlar, böylece bir yol olmadan sadece #r "MyLibrary.dll"'u yapabilirsiniz.

Bu devasa bir hack, ama bazı insanlar yararlı bulabilir gibi görünüyor, bu yüzden paylaşıyorum.

+0

Bir komut dosyası, çalıştığı yerden alabilir mi? Bu da güzel olurdu. – BuddyJoe

+1

Sisteminizde birden fazla VS örneğinin çalışması durumunda bu yöntemin sizi zor duruma sokabileceğini unutmayın. –

+0

çok havalı. Teşekkürler. – BuddyJoe

İlgili konular