【问题标题】:F#/C# - fsx Script Files and Project ReferencesF#/C# - fsx 脚本文件和项目参考
【发布时间】:2011-03-07 08:36:55
【问题描述】:

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

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

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

【问题讨论】:

    标签: f# f#-interactive


    【解决方案1】:

    不,它没有从项目中获取任何设置,您必须对路径进行硬编码。 (这是我们将在未来版本中改进的场景。)也要小心“调试”与“发布”路径。

    编辑

    好的,哇,我发现了一些有用的东西:

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

    作为两个 sn-ps 执行,首先是除最后一行之外的所有内容,最后是最后一行。它基本上会更改您在 VS 中的 FSI 设置并重置会话,因此您可以在没有路径的情况下只使用 #r "MyLibrary.dll"

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

    【讨论】:

    猜你喜欢
    • 2011-08-04
    • 2022-10-22
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    相关资源
    最近更新 更多