Библиотеки классов, ориентированные на .netstandard 2.0, не имеют своих зависимостей в папке bin. Проблема при динамической загрузке сборок - PullRequest
0 голосов
/ 28 мая 2020

Я получаю исключение при динамической загрузке библиотеки классов .netstandard2.0 из консольного приложения .netcoreapp3.1, когда вызываемая мной функция ссылается на зависимость NuGet (в данном случае NInject.3.4.4, но не какая библиотека актуальна).

Это код вызывающего консольного приложения .netcoreapp3.1:

using ServicePluginInterface;

class Program
{
    static void Main(string[] args)
    {
        var path = @"C:\path\to\assembly\EmailPlugin.dll";

        var assembly = Assembly.LoadFile(path);
        var classType = assembly.GetTypes()
            .Where(x => typeof(IMyTask).IsAssignableFrom(x) && !x.IsInterface && !x.IsAbstract)
            .Select(x => x).FirstOrDefault();


        var myInstance = (IMyTask)Activator.CreateInstance(classType);
        myInstance.ExecuteTask();

    }

Это класс, который я создаю (динамически) из библиотеки классов и функции, в которой я вызываю загруженная сборка (EmailPlugin.dll):

using ServicePluginInterface;

namespace EmailPlugin
{
/// <summary>
/// A class that implements the "dummy.alpha" task
/// </summary>
public class EmailLoginTask : IMyTask
{
    public void ExecuteTask()
    {
        //IKernel kernel = new StandardKernel();
        //kernel.Bind<ClassLibNinjectModule>();

        // Sample placeholder code
        int a = 1;
        int b = a * a;
    }
}
}

Вызывающее приложение может успешно загрузить сборку, найти и построить класс EmailLoginTask и без проблем вызвать метод ExecuteTask(), как показано выше.

Однако, как только я раскомментирую материал IKernel (добавив using в NInject et c.), Я получаю следующее исключение для вызывающего приложения в строке myInstance.ExecuteTask():

'myInstance.ExecuteTask ()' выдал исключение типа 'System.IO.FileNotFoundException' Data: {System.Collections.ListDictionaryInternal} FileName: «Ninject, Version = 3.3.4.0, Culture = нейтральный, PublicKeyToken = c7192dc5380945e7 "FusionLog:" "HResult: -2147024894 HelpLink: null InnerException: null Сообщение:" Не удалось загрузить файл или сборку Ninject, версия = 3.3.4.0, культура = нейтральная, PublicKeyTo ken = c7192dc5380945e7 '. Система не может найти указанный файл. "Источник:" EmailPlugin "StackTrace:" в EmailPlugin.EmailLoginTask.ExecuteTask (null) в C: \ ... \ EmailLoginTask.cs: line 31 "TargetSite: {Void ExecuteTask (null )}

Сборка NInject находится в той же папке. Вот список папок:

28/05/2020  14:13     7,680 ActivbaseServicePluginInterface.dll
28/05/2020  14:13     1,748 ActivbaseServicePluginInterface.pdb
28/05/2020  14:13     8,417 EmailPlugin.deps.json
28/05/2020  15:17     4,608 EmailPlugin.dll
28/05/2020  15:17       988 EmailPlugin.pdb
13/11/2017  04:01   137,728 Ninject.dll
26/05/2020  10:46    50,688 RSPlatform.Common.dll
26/05/2020  10:46   148,992 RSPlatform.Common.pdb
28/05/2020  14:13    27,648 RSPlatform.Mail.dll
28/05/2020  14:13   130,560 RSPlatform.Mail.pdb
11/09/2019  13:04    22,960 System.Reflection.Emit.ILGeneration.dll
11/09/2019  13:04    22,952 System.Reflection.Emit.Lightweight.dll

Я проверил Ninject.dll, и это правильная версия, strong named, et c.

EmailPlugin.deps.json тоже правильно ссылается на NInject.

Как мне заставить сборку загружать зависимости библиотеки классов?

ПРИМЕЧАНИЕ: И родительская сборка, и библиотека классов ссылаются на общую библиотеку классов, которая определяет интерфейс IMyTask. Действительно, все это отлично работает, когда NInject не упоминается в функции.

Вот копия EmailPlugin.deps.json файл:

"runtimeTarget": {
    "name": ".NETStandard,Version=v2.0/",
    "signature": ""
},
"compilationOptions": {},
"targets": {
    ".NETStandard,Version=v2.0": {},
    ".NETStandard,Version=v2.0/": {
        "EmailPlugin/1.0.0": {
            "dependencies": {
                "ActivbaseServicePluginInterface": "1.0.0",
                "NETStandard.Library": "2.0.3",
                "Ninject": "3.3.4",
                "RSPlatform.Mail": "1.0.0"
            },
            "runtime": {
                "EmailPlugin.dll": {}
            }
        },
        "Microsoft.NETCore.Platforms/1.1.0": {},
        "Microsoft.NETCore.Targets/1.1.0": {},
        "NETStandard.Library/2.0.3": {
            "dependencies": {
                "Microsoft.NETCore.Platforms": "1.1.0"
            }
        },
        "Ninject/3.3.4": {
            "dependencies": {
                "System.Reflection.Emit.ILGeneration": "4.3.0",
                "System.Reflection.Emit.Lightweight": "4.3.0"
            },
            "runtime": {
                "lib/netstandard2.0/Ninject.dll": {
                    "assemblyVersion": "3.3.4.0",
                    "fileVersion": "3.3.4.0"
                }
            }
        },
        "System.IO/4.3.0": {
            "dependencies": {
                "Microsoft.NETCore.Platforms": "1.1.0",
                "Microsoft.NETCore.Targets": "1.1.0",
                "System.Runtime": "4.3.0",
                "System.Text.Encoding": "4.3.0",
                "System.Threading.Tasks": "4.3.0"
            }
        },
        "System.Reflection/4.3.0": {
            "dependencies": {
                "Microsoft.NETCore.Platforms": "1.1.0",
                "Microsoft.NETCore.Targets": "1.1.0",
                "System.IO": "4.3.0",
                "System.Reflection.Primitives": "4.3.0",
                "System.Runtime": "4.3.0"
            }
        },
        "System.Reflection.Emit.ILGeneration/4.3.0": {
            "dependencies": {
                "System.Reflection": "4.3.0",
                "System.Reflection.Primitives": "4.3.0",
                "System.Runtime": "4.3.0"
            },
            "runtime": {
                "lib/netstandard1.3/System.Reflection.Emit.ILGeneration.dll": {
                    "assemblyVersion": "4.0.2.0",
                    "fileVersion": "4.6.24705.1"
                }
            }
        },
        "System.Reflection.Emit.Lightweight/4.3.0": {
            "dependencies": {
                "System.Reflection": "4.3.0",
                "System.Reflection.Emit.ILGeneration": "4.3.0",
                "System.Reflection.Primitives": "4.3.0",
                "System.Runtime": "4.3.0"
            },
            "runtime": {
                "lib/netstandard1.3/System.Reflection.Emit.Lightweight.dll": {
                    "assemblyVersion": "4.0.2.0",
                    "fileVersion": "4.6.24705.1"
                }
            }
        },
        "System.Reflection.Primitives/4.3.0": {
            "dependencies": {
                "Microsoft.NETCore.Platforms": "1.1.0",
                "Microsoft.NETCore.Targets": "1.1.0",
                "System.Runtime": "4.3.0"
            }
        },
        "System.Runtime/4.3.0": {
            "dependencies": {
                "Microsoft.NETCore.Platforms": "1.1.0",
                "Microsoft.NETCore.Targets": "1.1.0"
            }
        },
        "System.Text.Encoding/4.3.0": {
            "dependencies": {
                "Microsoft.NETCore.Platforms": "1.1.0",
                "Microsoft.NETCore.Targets": "1.1.0",
                "System.Runtime": "4.3.0"
            }
        },
        "System.Threading.Tasks/4.3.0": {
            "dependencies": {
                "Microsoft.NETCore.Platforms": "1.1.0",
                "Microsoft.NETCore.Targets": "1.1.0",
                "System.Runtime": "4.3.0"
            }
        },
        "ActivbaseServicePluginInterface/1.0.0": {
            "runtime": {
                "ActivbaseServicePluginInterface.dll": {}
            }
        },
        "RSPlatform.Mail/1.0.0": {
            "runtime": {
                "RSPlatform.Mail.dll": {}
            }
        },
        "RSPlatform.Common/1.0.0.0": {
            "runtime": {
                "RSPlatform.Common.dll": {
                    "assemblyVersion": "1.0.0.0",
                    "fileVersion": "1.0.0.0"
                }
            }
        }
    }
},
"libraries": {
    "EmailPlugin/1.0.0": {
        "type": "project",
        "serviceable": false,
        "sha512": ""
    },
    "Microsoft.NETCore.Platforms/1.1.0": {
        "type": "package",
        "serviceable": true,
        "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==",
        "path": "microsoft.netcore.platforms/1.1.0",
        "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512"
    },
    "Microsoft.NETCore.Targets/1.1.0": {
        "type": "package",
        "serviceable": true,
        "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==",
        "path": "microsoft.netcore.targets/1.1.0",
        "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512"
    },
    "NETStandard.Library/2.0.3": {
        "type": "package",
        "serviceable": true,
        "sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==",
        "path": "netstandard.library/2.0.3",
        "hashPath": "netstandard.library.2.0.3.nupkg.sha512"
    },
    "Ninject/3.3.4": {
        "type": "package",
        "serviceable": true,
        "sha512": "sha512-CmbWW97FfJuh4LEOVZM/spqXl4KAulRUjqeMwRd5J9rDMQArmIYaDMU3pyzXXHT062tbF0OPIMwI7tSOtprPfg==",
        "path": "ninject/3.3.4",
        "hashPath": "ninject.3.3.4.nupkg.sha512"
    },
    "System.IO/4.3.0": {
        "type": "package",
        "serviceable": true,
        "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==",
        "path": "system.io/4.3.0",
        "hashPath": "system.io.4.3.0.nupkg.sha512"
    },
    "System.Reflection/4.3.0": {
        "type": "package",
        "serviceable": true,
        "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==",
        "path": "system.reflection/4.3.0",
        "hashPath": "system.reflection.4.3.0.nupkg.sha512"
    },
    "System.Reflection.Emit.ILGeneration/4.3.0": {
        "type": "package",
        "serviceable": true,
        "sha512": "sha512-59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==",
        "path": "system.reflection.emit.ilgeneration/4.3.0",
        "hashPath": "system.reflection.emit.ilgeneration.4.3.0.nupkg.sha512"
    },
    "System.Reflection.Emit.Lightweight/4.3.0": {
        "type": "package",
        "serviceable": true,
        "sha512": "sha512-oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==",
        "path": "system.reflection.emit.lightweight/4.3.0",
        "hashPath": "system.reflection.emit.lightweight.4.3.0.nupkg.sha512"
    },
    "System.Reflection.Primitives/4.3.0": {
        "type": "package",
        "serviceable": true,
        "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==",
        "path": "system.reflection.primitives/4.3.0",
        "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512"
    },
    "System.Runtime/4.3.0": {
        "type": "package",
        "serviceable": true,
        "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==",
        "path": "system.runtime/4.3.0",
        "hashPath": "system.runtime.4.3.0.nupkg.sha512"
    },
    "System.Text.Encoding/4.3.0": {
        "type": "package",
        "serviceable": true,
        "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==",
        "path": "system.text.encoding/4.3.0",
        "hashPath": "system.text.encoding.4.3.0.nupkg.sha512"
    },
    "System.Threading.Tasks/4.3.0": {
        "type": "package",
        "serviceable": true,
        "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==",
        "path": "system.threading.tasks/4.3.0",
        "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512"
    },
    "ActivbaseServicePluginInterface/1.0.0": {
        "type": "project",
        "serviceable": false,
        "sha512": ""
    },
    "RSPlatform.Mail/1.0.0": {
        "type": "project",
        "serviceable": false,
        "sha512": ""
    },
    "RSPlatform.Common/1.0.0.0": {
        "type": "reference",
        "serviceable": false,
        "sha512": ""
    }
}
}

Я потратил около двух часов, пытаясь получить информацию из «fuslogvw.exe», но не подвожу нигде с этим (в FileNotFoundException упорно отказывается заполнять свойство FusionLog; при запуске Fusiosn LogViewer в режиме администратора, он не показывает ничего значимого или значимого в контексте приложения)

В принципе, почему NInject не разрешается, когда он находится в той же папке, что и библиотека классов и строгое имя соответствует?

Спасибо, Крис

...