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# project. You insert a script file - test.fsx into the F# project. What is the correct way to reference the C# assembly in the script file?
#r "SomeComp.Framework.dll" // doesn't work
Is there some way to do this without hardcoding a path? Does the .fsx file get any settings/properties from being located inside a F# project?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With