Namespace or module "NagLibrary" not found, but reference successfully added (?) - f#

I have a 3rd party .dll that I have successfully added as a reference in both a VS 2010 C# project and an F# VS 2010 project. I can view the contents in the object browser in both cases, but the F# version won't let me "open" the library. It works fine in the C# project (with the "using" directive), and I can write a program that uses the contents of this particular .dll. I have not had any trouble with other .dlls in F#/VS 2010/.NET 4.0 on Windows 7.
Any ideas as to why this might be happening? Or how I could debug this further?

See what the csc.exe and fsc.exe command-lines have for the library in question (in VS, open the 'Output Window' after a rebuild), to see if they both have the same reference (e.g. -r:Path\Library.dll).
And to be clear, you're saying
open NagLibrary
in F# yields the error message in the title, but
using NagLibrary;
in C# works and opens the namespace?

make sure you reference the path within the script using the double "\" convention
for me this worked
#r "C:\homeware\\blp\\api\\APIv3\\DotnetAPI\\v3.4.5.4\\lib\\Bloomberglp.Blpapi.dll"
open Bloomberglp.Blpapi

Related

Loading F# modules not in the current directory

I'm writing a simple F# console app with Visual Studio 2017 targeting .NET Core 2.0. I'm wondering if it's possible to open a module not present in the current directory.
For example :
/root/foo.fs
/root/SubDirectory/bar.fs
How can bar.fs open the Foo module or vice versa?
I already tried :
open Foo
open "../Foo"
open "C:/AbsolutePath/Foo"
With the last two ones, VS complained with :
FS0010 : Unexpected string literal in open declaration. Expected identifier, 'global' or other token.
There seems to be no documentation about this.
Any help would be appreciated.
Actually you can only add or reorder files in VS2017 in the preview version I believe (so not yet on 15.5.6). But TheQuickBrownFox is correct, the file that has your module has to be in the fsproj file, and the order is important.
For VSCode, you can use the Command (or Project Explorer) in Ionide: Ctrl+Shift+P: F#: Add Current File to Project and also F#: Move File Up/Down (there's a right click meny on the F# Project Explorer as well.
In Visual Studio 2017 you can right-click the Project and choose Edit .fsproj. VS will reload the file automatically on save, so no need to unload a project like in VS2015. It will look something like this:
You can see that MyModule.fs is in the root of the project and the line with MyModule.fs needs to be above any other files that reference it. You can use Alt+Up/Down Arrow to move lines around.
Then you can just open this module and use it. For example Add is defined in this module.
I also added the #load directive, this is only if you want to test it in FSI, and the compiler will ignore it.

F# interactive throws NotImplementedException in PCLStorage

I'm getting NotImplementedException trying to use PCLStorage.FileSystem.Current in F# interactive.
I downloaded PCLStorage with NuGet, right clicked on the reference and clicked "Send to F# interactive"
I'm working with VS2015 update 1, and I've re-installed the package as suggested in this answer
How can I get PCLStorage to work in F# interactive?
--> Referenced 'C:\Users\amade\Documents\GitHub\audioExperiments\src\Audio\packages\PCLStorage.1.0.2\lib\portable-net45+wp8+wpa81+win8+monoandroid+monotouch+Xamarin.iOS+Xamarin.Mac\PCLStorage.dll'
> open PCLStorage;;
> PCLStorage.FileSystem.Current;;
> System.NotImplementedException: This functionality is not implemented in the portable version of this assembly. You should reference the PCLStorage NuGet package from your main application project in order to reference the platform-specific implementation.
at PCLStorage.FileSystem.get_Current()
at <StartupCode$FSI_0017>.$FSI_0017.main#()
Stopped due to error
The PCL you've referenced is the one designed to target all platforms (Xamarin, Windows desktop, Windows phone etc). This dll is simply used as a means of defining all of the individual methods as part of the bait and switch PCL technique http://log.paulbetts.org/the-bait-and-switch-pcl-trick/ If you want to use the library with FSI then you'll need to add a specific reference to the appropriate platform's DLL. In this case you'll want to refer to the windows desktop version of the project which you downloaded from NuGet.

scripts don't recognize FSharp.Data

Somewhat of a F# beginner. I'm trying to test out some of my XmlTypeProvider code in the interactive window by first entering it in a script (fsx) file. The script file won't recognize the following
open FSharp.Data // gives "The namespace or module 'FSharp' is not defined"
Everything has been added to reference, and .fs files seem to not have any problems finding the XmlTypeProvider reference but for some reason, a script in the same project does not. I even got the code to work in a .fs file.
I added FSharp.Data with nuget and everything seem to add correctly. What am I missing here?
Add a reference in the script to the nuget packages folder that contains FSharp.Data.dll. That folder also contains the designer dll (FSharp.Data.DesignTime.dll)
#r #"<your nuget packages folder>\FSharp.Data.2.1.0\lib\net40\FSharp.Data.dll"
Incidentally, I was just debugging this error last week. There are essentially three possible reasons:
The file could not be found. The most obvious one is that F# actually cannot find the dll file. Make sure the reference is correct (check References in the project properties) or make sure your #r points to the right file (when using an F# script file)
Type provider is not trusted. The type provider is blocked by Visual Studio. This can happen if you click on "Disable" when you load the provider for the first time. To fix this, go to "Tools" - "Options" - "F# Tools" - "Type Providers" and enable the type provider (check "Trusted").
The DLL is blocked by OS. Finally, if the dll comes from an untrusted source, Windows might block it (this happens especially if you download a zip file and extract the file using Windows). To unblock the file, go to file properties and click "Unblock". There is a good description here..

F# interactive: Reference a project in currently open solution

I would like to use the F# interactive console with the projects in the currently open solution in Visual Studio 2010. Is there a quick and easy way to add a reference in the F# interactive console to reference projects in the currently open solution?
I've got lines like this at the top of my .fs file:
#if INTERACTIVE
#r #"C:\path\to\some.dll"
#I #"C:\Users\bford\path\to\a\project\in\this\solution\bin\Debug"
#r "Project.name"
#endif
Alt-Enter now drops me into fsi with all the required stuff loaded
If it's a project you reference often, you can add an 'always' reference to the FSI command line, under Tools->Options->F# Tools->F# interactive options.
Add a -r switch like:
-r "C:\Users\yaddayadda\MyDll.dll"
I don't think there is any direct way to reference a project in the solution. The best way I can think of is to add a FSX file somewhere to your project with the #r directive:
#r #"bin\Debug\YourProject.dll"
Then you can at least reference the compiled DLL file simply by hitting Alt+Enter in Visual Studio. As far as I know, you cannot reference the project - you can only reference an assembly.
Currently, F# Interactive is really disconnected from the project system in Visual Studio. I suppose that closer integration would be quite useful (but probably difficult to provide).
Now in Visual Studio 2013 you can add a reference to the F# interactive window by right clicking on the referenced dll and clicking "Send to F# interactive".
I would think it should be straightforward to reference the current project, obtain the list of references it contains, and then optionally generate a list of #r (and possibly #i) statements for the interactive session being created, referencing the dll of the project itself as well.
For example: "fsi /i:pathOfLib1 /r:lib1 /i:pathOfLib2 /r:lib2 ...."
PS: base on the MSDN article it doesn't appear that library names can include their path prefixes hence the separate into /i and /i : http://msdn.microsoft.com/en-us/library/dd233172%28v=vs.100%29.aspx
It would be good if the Visual Studio F# Interactive Options menu allowed for the stipulation of a startup script that the invocation could pass to FSI via the "--use:" directive. Such a script could then be passed solution metadata that allows for the environments to be more integrated such as loading latest project outputs.

Seq.generate_using is MIA

I'm trying to use the Seq.generate_using function but unfortunately, I don't seem to be able to find it. I thought it would be living here:
Microsoft.FSharp.Collections.Seq.generate_using
But it doesn't. I am getting the error listed below.
C:\Users\Owner\Documents\Visual Studio
2008\Projects\fsharp1\Program.fs(54,63):
error FS0039: The value, constructor,
namespace or type 'generate_using' is
not defined. A construct with this
name was found in
FSharp.PowerPack.dll, which contains
some modules and types that were
implicitly referenced in some previous
versions of F#. You may need to add an
explicit reference to this DLL in
order to compile this code.
According to the Sept 2008 CTP Release Notes:
The F# library is split into two
components. FSharp.Core.dll: Contains
the core F# libraries, which will be
stabilized and versioned infrequently.
FSharp.PowerPack.dll: Contains
additional useful F# libraries and
tools which will version more
frequently, and allow continued
innovation on top of the core F#
language and libraries.
Some methods in the Seq module were moved into the FSharp.PowerPack assembly, so you can only get those methods by doing the following:
If you're using Visual Studio, open your Solution Explorer, right-click on the project file, choose "Add Reference", and add "FSharp.PowerPack.dll".
If you're using a script file or fsi, then type #r "FSharp.PowerPack";; to load the assembly.
Now you should be able to call Seq.generate_using.
The #r "FSharp.PowerPack";; works for me but the addition of PowerPack to my solution does not. I am trying to use HashSet<>.

Resources