diff --git a/src/mod/languages/mod_managed/managed/Demo.cs b/src/mod/languages/mod_managed/managed/Demo.csx
similarity index 95%
rename from src/mod/languages/mod_managed/managed/Demo.cs
rename to src/mod/languages/mod_managed/managed/Demo.csx
index d342c5443e..7a2509da96 100644
--- a/src/mod/languages/mod_managed/managed/Demo.cs
+++ b/src/mod/languages/mod_managed/managed/Demo.csx
@@ -32,7 +32,7 @@
// How to test the demo (in the mod/managed directory):
// -- Compile to dll for "normal" loading
// -- Compile to exe for script EXE loading
-// -- Rename to demo.csx for dynamic compilation
+// -- Copy to managed directory for dynamic compilation
using System;
using FreeSWITCH;
@@ -85,7 +85,7 @@ public class LoadDemo : ILoadNotificationPlugin {
public class ScriptDemo {
- static void Main() {
+ public static void Main() {
switch (FreeSWITCH.Script.ContextType) {
case ScriptContextType.Api: {
var ctx = FreeSWITCH.Script.GetApiContext();
diff --git a/src/mod/languages/mod_managed/managed/FreeSWITCH.Managed.csproj b/src/mod/languages/mod_managed/managed/FreeSWITCH.Managed.csproj
index 7010cf15c1..d98e183a8d 100644
--- a/src/mod/languages/mod_managed/managed/FreeSWITCH.Managed.csproj
+++ b/src/mod/languages/mod_managed/managed/FreeSWITCH.Managed.csproj
@@ -52,7 +52,7 @@
-
+
diff --git a/src/mod/languages/mod_managed/managed/Loader.cs b/src/mod/languages/mod_managed/managed/Loader.cs
index f2e93d6244..c7c9cc12c6 100644
--- a/src/mod/languages/mod_managed/managed/Loader.cs
+++ b/src/mod/languages/mod_managed/managed/Loader.cs
@@ -219,15 +219,24 @@ namespace FreeSWITCH {
setup.ApplicationName = Path.GetFileName(fileName) + "_" + appDomainCount;
var domain = AppDomain.CreateDomain(setup.ApplicationName, null, setup);
- var pm = (PluginManager)domain.CreateInstanceAndUnwrap(pmType.Assembly.FullName, pmType.FullName, null);
- if (!pm.Load(fileName)) {
+ PluginManager pm;
+ try {
+ pm = (PluginManager)domain.CreateInstanceAndUnwrap(pmType.Assembly.FullName, pmType.FullName, null);
+ if (!pm.Load(fileName)) {
+ AppDomain.Unload(domain);
+ unloadFile(fileName);
+ return;
+ }
+ } catch (Exception ex) {
+ // On an exception, we will unload the current file so an old copy doesnt stay active
+ Log.WriteLine(LogLevel.Alert, "Exception loading {0}: {1}", fileName, ex.ToString());
AppDomain.Unload(domain);
unloadFile(fileName);
return;
}
+ // Update dictionaries atomically
lock (loaderLock) {
- // Update dictionaries atomically
unloadFile(fileName);
var pi = new PluginInfo { FileName = fileName, Domain = domain, Manager = pm };
@@ -279,7 +288,7 @@ namespace FreeSWITCH {
AppDomain.Unload(d);
Log.WriteLine(LogLevel.Info, "Unloaded {0}, domain {1}.", pi.FileName, friendlyName);
} catch (Exception ex) {
- Log.WriteLine(LogLevel.Critical, "Could not unload {0}, domain {1}: {2}", pi.FileName, friendlyName, ex.ToString());
+ Log.WriteLine(LogLevel.Alert, "Could not unload {0}, domain {1}: {2}", pi.FileName, friendlyName, ex.ToString());
}
});
t.Priority = System.Threading.ThreadPriority.BelowNormal;