您有一个包含一个名为SomeComp.Framework的C#项目的解决方案。您向该解决方案添加了一个F#项目,并在F#项目中引用了SomeComp.Framework项目。您在F#项目中插入了一个脚本文件test.fsx。正确的方法是如何在脚本文件中引用C#程序集?
#r "SomeComp.Framework.dll" // doesn't work
有没有一种方法可以不硬编码路径来完成这个操作? .fsx文件是否会因为位于F#项目内而获得任何设置/属性?
您有一个包含一个名为SomeComp.Framework的C#项目的解决方案。您向该解决方案添加了一个F#项目,并在F#项目中引用了SomeComp.Framework项目。您在F#项目中插入了一个脚本文件test.fsx。正确的方法是如何在脚本文件中引用C#程序集?
#r "SomeComp.Framework.dll" // doesn't work
有没有一种方法可以不硬编码路径来完成这个操作? .fsx文件是否会因为位于F#项目内而获得任何设置/属性?
#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"
而无需路径。
这是一个巨大的 hack,但似乎有些人可能会发现它有用,所以我分享一下。