F#/ C# - fsx脚本文件和项目参考

时间:2010-06-23 14:23:07

标签: f# f#-interactive

您有一个包含一个C#项目的解决方案。 SomeComp.Framework是名称。 您将F#项目添加到解决方案中。您在F#项目中引用SomeComp.Framework项目。您将脚本文件 - test.fsx插入到F#项目中。在脚本文件中引用C#程序集的正确方法是什么?

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

如果没有硬编码路径,有没有办法做到这一点? .fsx文件是否可以使任何设置/属性位于F#项目中?

1 个答案:

答案 0 :(得分:16)

不,它没有从项目中获得任何设置,您必须对路径进行硬编码。 (这是我们将在未来版本中进行改进的情况。)请注意“调试”与“发布”路径。

修改

好的,哇,我想出了一些有用的东西:

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

这是一个巨大的黑客,但似乎有些人可能觉得它很有用,所以我分享它。