F # / C # - fsx Файлы сценариев и ссылки на проекты - PullRequest
8 голосов
/ 23 июня 2010

У вас есть решение с одним проектом C #. SomeComp.Framework это имя. Вы добавляете проект F # к решению. Вы ссылаетесь на проект SomeComp.Framework в проекте F #. Вы вставляете файл сценария test.fsx в проект F #. Как правильно ссылаться на сборку C # в файле сценария?

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

Есть ли способ сделать это без жесткого кодирования пути? Получает ли файл .fsx какие-либо настройки / свойства, находясь внутри проекта F #?

1 Ответ

16 голосов
/ 23 июня 2010

Нет, он не получает никаких настроек из проекта, вам нужно жестко прописать путь. (Это сценарий, который мы рассмотрим для улучшения в будущем выпуске.) Также будьте осторожны с путями «Отладка» и «Выпуск».

EDIT

Хорошо, вау, я понял что-то полезное:

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

Выполните это как два фрагмента, сначала все, кроме последней строки, и, наконец, последнюю строку. Он в основном меняет ваши настройки FSI внутри VS и сбрасывает сеанс, поэтому впоследствии вы можете просто #r "MyLibrary.dll" без пути.

Это гигантский хак, но кажется, что некоторые люди могут найти его полезным, поэтому я делюсь им.

...