/// <summary> /// Import a library (if it hasn't been imported yet). /// </summary> /// <param name="library"></param> public void ImportLibrary(string library, ILogger logger) { if (null == library) { throw new ArgumentNullException(); } if (!library.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase) && !library.EndsWith(".ds", StringComparison.InvariantCultureIgnoreCase)) { const string errorMessage = "Invalid library format."; OnLibraryLoadFailed(new LibraryLoadFailedEventArgs(library, errorMessage)); return; } if (importedFunctionGroups.ContainsKey(library)) { string errorMessage = string.Format("Library {0} has been loaded.", library); OnLibraryLoadFailed(new LibraryLoadFailedEventArgs(library, errorMessage)); return; } if (!DynamoPathManager.Instance.ResolveLibraryPath(ref library)) { string errorMessage = string.Format("Cannot find library path: {0}.", library); OnLibraryLoadFailed(new LibraryLoadFailedEventArgs(library, errorMessage)); return; } OnLibraryLoading(new LibraryLoadingEventArgs(library)); try { int globalFunctionNumber = GraphUtilities.GetGlobalMethods(string.Empty).Count; DLLFFIHandler.Register(FFILanguage.CSharp, new CSModuleHelper()); IList <ClassNode> importedClasses = GraphUtilities.GetClassesForAssembly(library); if (GraphUtilities.BuildStatus.ErrorCount > 0) { string errorMessage = string.Format("Build error for library: {0}", library); logger.LogWarning(errorMessage, WarningLevel.Moderate); foreach (ErrorEntry error in GraphUtilities.BuildStatus.Errors) { logger.LogWarning(error.Message, WarningLevel.Moderate); errorMessage += error.Message + "\n"; } OnLibraryLoadFailed(new LibraryLoadFailedEventArgs(library, errorMessage)); return; } foreach (ClassNode classNode in importedClasses) { ImportClass(library, classNode); } // GraphUtilities.GetGlobalMethods() ignores input and just // return all global functions. The workaround is to get // new global functions after importing this assembly. List <ProcedureNode> globalFunctions = GraphUtilities.GetGlobalMethods(string.Empty); for (int i = globalFunctionNumber; i < globalFunctions.Count; ++i) { ImportProcedure(library, globalFunctions[i]); } } catch (Exception e) { OnLibraryLoadFailed(new LibraryLoadFailedEventArgs(library, e.Message)); return; } OnLibraryLoaded(new LibraryLoadedEventArgs(library)); }