2010-06-23 27 views
8

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

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

有没有办法做到这一点,而不硬编码的路径? .fsx文件是否获取了位于F#项目中的任何设置/属性?

回答

15

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

编辑

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

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

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

+0

脚本可以从它运行的地方拾取吗?那也会很好。 – BuddyJoe 2010-06-23 15:56:44

+1

请注意,如果您的系统上运行有多个VS实例,此方法可能会让您陷入麻烦。 – 2010-06-23 19:49:31

+0

很酷。谢谢。 upvotes – BuddyJoe 2010-06-23 20:36:57