F#/C# - fsx脚本文件和项目引用

8

您有一个包含一个名为SomeComp.Framework的C#项目的解决方案。您向该解决方案添加了一个F#项目,并在F#项目中引用了SomeComp.Framework项目。您在F#项目中插入了一个脚本文件test.fsx。正确的方法是如何在脚本文件中引用C#程序集?

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

有没有一种方法可以不硬编码路径来完成这个操作? .fsx文件是否会因为位于F#项目内而获得任何设置/属性?

1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
16
不,它不会从项目中获取任何设置,您必须硬编码路径。(这是我们将在未来版本中改进的情况) 请注意“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" 而无需路径。

这是一个巨大的 hack,但似乎有些人可能会发现它有用,所以我分享一下。


脚本能够从它停止的地方继续运行吗?这也是不错的。 - BuddyJoe
1
请注意,如果您的系统上有多个 Visual Studio 实例正在运行,则此方法可能会使您陷入麻烦。 - Dmitry Lomov
那是一个巨大的黑客行为。但有时了解内部工作方式也很好。 - BuddyJoe
嗨,布莱恩,我希望你看到这是一个经常出现的问题(https://dev59.com/fWkw5IYBdhLWcg3wSorA),我认为理顺它是有意义的。 - nicolas
我还有一个方便的解决方法:https://github.com/nrolland/FStat/blob/master/FStat/scriptSetup.fsx - nicolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,