diff --git a/Directory.Build.targets b/Directory.Build.targets
new file mode 100644
index 00000000000..4596aa08441
--- /dev/null
+++ b/Directory.Build.targets
@@ -0,0 +1,15 @@
+
+
+
+
+ false
+
+
+ false
+
+
+
+
\ No newline at end of file
diff --git a/Flow.Launcher.Core/Flow.Launcher.Core.csproj b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
index 87c390d3414..9f146a457fb 100644
--- a/Flow.Launcher.Core/Flow.Launcher.Core.csproj
+++ b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
@@ -54,12 +54,8 @@
-
-
-
-
diff --git a/Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs b/Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs
new file mode 100644
index 00000000000..b9b878a7bda
--- /dev/null
+++ b/Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs
@@ -0,0 +1,57 @@
+using Flow.Launcher.Infrastructure;
+using System;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Runtime.Loader;
+
+namespace Flow.Launcher.Core.Plugin
+{
+ internal class PluginAssemblyLoader : AssemblyLoadContext
+ {
+ private readonly AssemblyDependencyResolver dependencyResolver;
+
+ private readonly AssemblyDependencyResolver referencedPluginPackageDependencyResolver;
+
+ private readonly AssemblyName assemblyName;
+
+ internal PluginAssemblyLoader(string assemblyFilePath)
+ {
+ dependencyResolver = new AssemblyDependencyResolver(assemblyFilePath);
+ assemblyName = new AssemblyName(Path.GetFileNameWithoutExtension(assemblyFilePath));
+
+ referencedPluginPackageDependencyResolver =
+ new AssemblyDependencyResolver(Path.Combine(Constant.ProgramDirectory, "Flow.Launcher.Plugin.dll"));
+ }
+
+ internal Assembly LoadAssemblyAndDependencies()
+ {
+ return LoadFromAssemblyName(assemblyName);
+ }
+
+ protected override Assembly Load(AssemblyName assemblyName)
+ {
+ string assemblyPath = dependencyResolver.ResolveAssemblyToPath(assemblyName);
+
+ // When resolving dependencies, ignore assembly depenedencies that already exits with Flow.Launcher.Plugin
+ // Otherwise will get unexpected behaviour with plugins, e.g. JsonIgnore attribute not honored in WebSearch or other plugins
+ // that use Newtonsoft.Json
+ if (assemblyPath == null || ExistsInReferencedPluginPackage(assemblyName))
+ return null;
+
+ return LoadFromAssemblyPath(assemblyPath);
+ }
+
+ internal Type FromAssemblyGetTypeOfInterface(Assembly assembly, Type type)
+ {
+ var allTypes = assembly.ExportedTypes;
+
+ return allTypes.First(o => o.IsClass && !o.IsAbstract && o.GetInterfaces().Contains(type));
+ }
+
+ internal bool ExistsInReferencedPluginPackage(AssemblyName assemblyName)
+ {
+ return referencedPluginPackageDependencyResolver.ResolveAssemblyToPath(assemblyName) != null;
+ }
+ }
+}
diff --git a/Flow.Launcher.Core/Plugin/PluginsLoader.cs b/Flow.Launcher.Core/Plugin/PluginsLoader.cs
index 1025f9bae34..224dbd85e92 100644
--- a/Flow.Launcher.Core/Plugin/PluginsLoader.cs
+++ b/Flow.Launcher.Core/Plugin/PluginsLoader.cs
@@ -41,9 +41,9 @@ public static IEnumerable DotNetPlugins(List source)
{
#if DEBUG
- var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(metadata.ExecuteFilePath);
- var types = assembly.GetTypes();
- var type = types.First(o => o.IsClass && !o.IsAbstract && o.GetInterfaces().Contains(typeof(IPlugin)));
+ var assemblyLoader = new PluginAssemblyLoader(metadata.ExecuteFilePath);
+ var assembly = assemblyLoader.LoadAssemblyAndDependencies();
+ var type = assemblyLoader.FromAssemblyGetTypeOfInterface(assembly, typeof(IPlugin));
var plugin = (IPlugin)Activator.CreateInstance(type);
#else
Assembly assembly = null;
@@ -51,10 +51,10 @@ public static IEnumerable DotNetPlugins(List source)
try
{
- assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(metadata.ExecuteFilePath);
+ var assemblyLoader = new PluginAssemblyLoader(metadata.ExecuteFilePath);
+ assembly = assemblyLoader.LoadAssemblyAndDependencies();
- var types = assembly.GetTypes();
- var type = types.First(o => o.IsClass && !o.IsAbstract && o.GetInterfaces().Contains(typeof(IPlugin)));
+ var type = assemblyLoader.FromAssemblyGetTypeOfInterface(assembly, typeof(IPlugin));
plugin = (IPlugin)Activator.CreateInstance(type);
}
diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
index d834bd2d36e..28d4c0e1f6a 100644
--- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
+++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
@@ -49,13 +49,10 @@
-
-
-
diff --git a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
index 5dda76bc4d7..6732d58c80f 100644
--- a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
+++ b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
@@ -1,4 +1,4 @@
-
+
netcoreapp3.1
@@ -60,12 +60,9 @@
-
+
-
-
-
\ No newline at end of file
diff --git a/Flow.Launcher.sln b/Flow.Launcher.sln
index 1dd93b2ba38..6196aa5df1f 100644
--- a/Flow.Launcher.sln
+++ b/Flow.Launcher.sln
@@ -53,6 +53,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
.gitattributes = .gitattributes
.gitignore = .gitignore
appveyor.yml = appveyor.yml
+ Directory.Build.targets = Directory.Build.targets
Scripts\flowlauncher.nuspec = Scripts\flowlauncher.nuspec
LICENSE = LICENSE
Scripts\post_build.ps1 = Scripts\post_build.ps1
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index 987a685ac54..8548ba39e5f 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -1,4 +1,4 @@
-
+
WinExe
@@ -72,23 +72,13 @@
-
-
-
-
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
-
-
-
-
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 13daddf109b..85b745a6b83 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -1,11 +1,13 @@
+ Library
netcoreapp3.1
{9B130CC5-14FB-41FF-B310-0A95B6894C37}
Properties
Flow.Launcher.Plugin.BrowserBookmark
Flow.Launcher.Plugin.BrowserBookmark
+ true
false
false
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json
index 7bb662b369d..98db163ec86 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json
@@ -7,6 +7,6 @@
"Version": "1.2.1",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
- "ExecuteFileName": "Flow.Launcher.Plugin.browserBookmark.dll",
+ "ExecuteFileName": "Flow.Launcher.Plugin.BrowserBookmark.dll",
"IcoPath": "Images\\bookmark.png"
}
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
index e7cae42aebe..9e1fefdb30d 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
@@ -1,12 +1,14 @@
-
+
+ Library
netcoreapp3.1
{59BD9891-3837-438A-958D-ADC7F91F6F7E}
Properties
Flow.Launcher.Plugin.Caculator
Flow.Launcher.Plugin.Caculator
- true
+ true
+ true
false
false
@@ -102,9 +104,7 @@
-
-
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Color/Flow.Launcher.Plugin.Color.csproj b/Plugins/Flow.Launcher.Plugin.Color/Flow.Launcher.Plugin.Color.csproj
index 19f8fb98075..c7fe8271a6c 100644
--- a/Plugins/Flow.Launcher.Plugin.Color/Flow.Launcher.Plugin.Color.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Color/Flow.Launcher.Plugin.Color.csproj
@@ -1,11 +1,13 @@
+ Library
netcoreapp3.1
{F35190AA-4758-4D9E-A193-E3BDF6AD3567}
Properties
Flow.Launcher.Plugin.Color
Flow.Launcher.Plugin.Color
+ true
false
false
@@ -96,9 +98,4 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.ControlPanel/Flow.Launcher.Plugin.ControlPanel.csproj b/Plugins/Flow.Launcher.Plugin.ControlPanel/Flow.Launcher.Plugin.ControlPanel.csproj
index d1c185c3633..69973763435 100644
--- a/Plugins/Flow.Launcher.Plugin.ControlPanel/Flow.Launcher.Plugin.ControlPanel.csproj
+++ b/Plugins/Flow.Launcher.Plugin.ControlPanel/Flow.Launcher.Plugin.ControlPanel.csproj
@@ -1,11 +1,13 @@
+ Library
netcoreapp3.1
{1EE20B48-82FB-48A2-8086-675D6DDAB4F0}
Properties
Flow.Launcher.Plugin.ControlPanel
Flow.Launcher.Plugin.ControlPanel
+ true
false
false
@@ -96,9 +98,4 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
index efa5339b4d9..a1a08843a50 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
@@ -5,6 +5,7 @@
netcoreapp3.1
true
true
+ true
false
diff --git a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Flow.Launcher.Plugin.PluginIndicator.csproj b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Flow.Launcher.Plugin.PluginIndicator.csproj
index 48639156e69..e6bfa7aa396 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Flow.Launcher.Plugin.PluginIndicator.csproj
+++ b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Flow.Launcher.Plugin.PluginIndicator.csproj
@@ -1,11 +1,13 @@
+ Library
netcoreapp3.1
{FDED22C8-B637-42E8-824A-63B5B6E05A3A}
Properties
Flow.Launcher.Plugin.PluginIndicator
Flow.Launcher.Plugin.PluginIndicator
+ true
false
false
@@ -96,10 +98,5 @@
PreserveNewest
-
-
-
-
-
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.PluginManagement/Flow.Launcher.Plugin.PluginManagement.csproj b/Plugins/Flow.Launcher.Plugin.PluginManagement/Flow.Launcher.Plugin.PluginManagement.csproj
index 49451d5ba84..08e89d86125 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginManagement/Flow.Launcher.Plugin.PluginManagement.csproj
+++ b/Plugins/Flow.Launcher.Plugin.PluginManagement/Flow.Launcher.Plugin.PluginManagement.csproj
@@ -1,12 +1,14 @@
+ Library
netcoreapp3.1
{049490F0-ECD2-4148-9B39-2135EC346EBE}
Properties
Flow.Launcher.Plugin.PluginManagement
Flow.Launcher.Plugin.PluginManagement
true
+ true
false
false
@@ -97,10 +99,4 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Flow.Launcher.Plugin.ProcessKiller.csproj b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Flow.Launcher.Plugin.ProcessKiller.csproj
index ab84aa54acf..cf9c9629402 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Flow.Launcher.Plugin.ProcessKiller.csproj
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Flow.Launcher.Plugin.ProcessKiller.csproj
@@ -1,6 +1,7 @@
+ Library
netcoreapp3.1
Flow.Launcher.Plugin.ProcessKiller
Flow.Launcher.Plugin.ProcessKiller
@@ -8,6 +9,7 @@
https://github.com/Flow-Launcher/Flow.Launcher.Plugin.ProcessKiller
https://github.com/Flow-Launcher/Flow.Launcher.Plugin.ProcessKiller
flow-launcher flow-plugin
+ true
false
false
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj b/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
index 331566f90d1..3802297c70a 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
@@ -1,6 +1,7 @@
+ Library
netcoreapp3.1
{FDB3555B-58EF-4AE6-B5F1-904719637AB4}
Properties
@@ -8,6 +9,7 @@
Flow.Launcher.Plugin.Program
true
true
+ true
false
false
@@ -107,10 +109,7 @@
-
-
-
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Flow.Launcher.Plugin.Shell.csproj b/Plugins/Flow.Launcher.Plugin.Shell/Flow.Launcher.Plugin.Shell.csproj
index ad1dd079ebd..178d95010f7 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Flow.Launcher.Plugin.Shell.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Flow.Launcher.Plugin.Shell.csproj
@@ -1,12 +1,14 @@
+ Library
netcoreapp3.1
{C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}
Properties
Flow.Launcher.Plugin.Shell
Flow.Launcher.Plugin.Shell
true
+ true
false
false
@@ -94,9 +96,6 @@
-
-
-
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj b/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj
index b63654b7c22..bdab40457de 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj
@@ -1,12 +1,14 @@
+ Library
netcoreapp3.1
{0B9DE348-9361-4940-ADB6-F5953BFFCCEC}
Properties
Flow.Launcher.Plugin.Sys
Flow.Launcher.Plugin.Sys
true
+ true
false
false
@@ -125,10 +127,5 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Url/Flow.Launcher.Plugin.Url.csproj b/Plugins/Flow.Launcher.Plugin.Url/Flow.Launcher.Plugin.Url.csproj
index 75fa52290e9..7d802d81555 100644
--- a/Plugins/Flow.Launcher.Plugin.Url/Flow.Launcher.Plugin.Url.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Url/Flow.Launcher.Plugin.Url.csproj
@@ -1,12 +1,14 @@
+ Library
netcoreapp3.1
{A3DCCBCA-ACC1-421D-B16E-210896234C26}
true
Properties
Flow.Launcher.Plugin.Url
Flow.Launcher.Plugin.Url
+ true
false
false
@@ -88,10 +90,5 @@
PreserveNewest
-
-
-
-
-
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Flow.Launcher.Plugin.WebSearch.csproj b/Plugins/Flow.Launcher.Plugin.WebSearch/Flow.Launcher.Plugin.WebSearch.csproj
index c2449a49e5b..431ca9ce802 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Flow.Launcher.Plugin.WebSearch.csproj
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Flow.Launcher.Plugin.WebSearch.csproj
@@ -1,11 +1,13 @@
+ Library
netcoreapp3.1
{403B57F2-1856-4FC7-8A24-36AB346B763E}
Properties
Flow.Launcher.Plugin.WebSearch
Flow.Launcher.Plugin.WebSearch
+ true
false
false
en
@@ -139,12 +141,6 @@
-
-
-
-
-
-