F#/C# - fsx Script Files and Project References

后端 未结 1 2024
栀梦
栀梦 2020-12-08 23:59

You have a solution with one C# project in it. SomeComp.Framework is the name. You add a F# project to the solution. You reference the SomeComp.Framework project in the F# p

相关标签:
1条回答
  • 2020-12-09 00:56

    No, it does not get any settings from the project, you have to hardcode the path. (This is a scenario we'll look at improving for a future release.) Be careful about 'Debug' versus 'Release' paths, too.

    EDIT

    Ok, wow, I figured out something useful:

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

    Execute that as two snippets, first everything but the last line, and finally the last line. It basically changes your FSI settings inside VS and resets the session, so subsequently you can just #r "MyLibrary.dll" without a path.

    It is a giant hack, but it seems like some folks may find it useful, so I am sharing it.

    0 讨论(0)
提交回复
热议问题