azureazure-functionsnuget-packagecsx

NuGet Packages do not compile Azure CSX


I have included a NuGet Package in an Azure Function app that I downloaded to work on in Visual Studio. I have added it to the project.json and I still get "error CS0246: The type or namespace name 'NetTopologySuite' could not be found (are you missing a using directive or an assembly reference?)". I've read through microsoft's documentation and cannot find what I could be doing wrong.

Here is a sample of what my csx looks like:

#r "System.Data"

using System;
using System.Data;
using System.Data.SqlClient;
using System.Net;
using NetTopologySuite;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    \\ Code to retrieve data from database and turn it into an array
    \\ of GeoJSON features called DataFromDatabase not shown


    NetTopologySuite.Features.Feature[] TrailSegments = DataFromDatabase;


    HttpResponseMessage resp = req.CreateResponse(HttpStatusCode.OK);
    resp.Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(DataFromDatabase), System.Text.Encoding.UTF8, "application/json");
    return resp;
}

Here is my project.json:

{
  "frameworks": {
    "net46": {
      "dependencies": {
        "NetTopologySuite.IO.GeoJSON": "1.14.0"
      }
    }
  }
}

Does anyone have more experience with this that could offer a little more than what's in the documentation?

"FUNCTIONS_EXTENSION_VERSION": "~1"
"WEBSITE_NODE_DEFAULT_VERSION": "6.5.0"

Solution

  • If you do upload the project.json file to your function folder(not function app folder), what you have done is exactly right. I have followed your steps and things work fine on my side.

    Nuget restoring for function editable online is not so sensitive, so you may wait for a while(you can do some edit in function code and click save or directly restart whole function app).

    After that, you can see a project.lock.json under the function folder. It means the package has been installed successfully. Then everything goes well.

    Update for multiple functions sharing reference.

    One function package restore can't be used by others. So we have to upload dlls manually if you don't want to add project.json to every function. See shared assemblies.

    1. Download NetTopologySuite.IO.GeoJSON.

    2. Find four dlls(NetTopologySuite.dll/NetTopologySuite.IO.GeoJSON.dll/GeoAPI.dll/PowerCollections.dll) in package and upload them to a bin folder under function app folder.

    3. Add four assemblies in code like #r "..\bin\NetTopologySuite.IO.GeoJSON.dll". You may also need add #r "Newtonsoft.Json" as it's one dependency in that package.

    4. If you use the dll with namespace like NetTopologySuite.Features.Feature[], you don't have to import namespaces. And vice versa.

    If you know those dependencies clearly, you can only upload and reference dlls you need.