'Could not load assembly',但程序集已加载
'Could not load assembly', but the assembly is already loaded
我正在开发一个简单的 WPF 应用程序,它使用两个外部 DLL,Nancy.dll
和 Nancy.Hosting.Self.dll
通过 http 发送一些数据。我想保持 .exe 文件独立,所以我试图将这两个 .dll 文件合并到应用程序中。我尝试了多种 post-build 合并方法,例如 NetZ
和 ILMerge
,但两者似乎都存在 wpf 应用程序问题,并且没有输出有效的可执行文件。
有 this post 有多个解决这个问题的建议,尽管它们都归结为相同的两件事:
- 使用 post-构建合并。这对我来说效果不佳。
- 将DLL作为内嵌资源放入应用程序中,必要时利用
AppDomain.CurrentDomain.AssemblyResolve
事件加载。
第二个选项似乎很有希望:事件被触发,它找到嵌入的资源,从中生成数据流并将其作为程序集加载。我可以验证程序集是否以多种方式加载:
Visual Studio的Debug -> Windows -> Modules
显示加载的程序集,
AppDomain.CurrentDomain.GetAssemblies()
还显示正在加载的程序集。
但是,在使用程序集时(在本例中调用 Nancy.Hosting.Self.NancyHost host = new NancyHost();
),我仍然收到以下错误:
Could not load file or assembly 'Nancy, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
我确实确保也加载了所有依赖项(如建议的那样here)并且所有加载的程序集都在同一个 AppDomain 中。另请注意,上述错误仅适用于 Nancy.dll
,AssemblyResolve
事件确实设法正确加载 Nancy.Hosting.Self.dll
。
我真的不知道我还做错了什么,我加载程序集时是否出了问题,或者南希是否特别表现异常(我发现 this issue on GitHub 其中我'我不确定它是否相关)。如果您对加载程序集、合并 dll 或替代 Nancy 有任何建议,我将非常乐意听到。
P.S.:
我尝试从 Nancy.dll
调用不同的方法,令我惊讶的是我能够; AssemblyResolve
方法确实有效。
初始化 Nancy.Hosting.Self.NancyHost
仍然有问题,堆栈跟踪提示了原因:
at System.AppDomain.CreateInstanceAndUnwrap(String assemblyName, String typeName)
at Nancy.AppDomainAssemblyCatalog.CreateRemoteReferenceProber(AppDomain appDomain)
at Nancy.AppDomainAssemblyCatalog.LoadNancyReferencingAssemblies(IEnumerable`1 loadedAssemblies)
at Nancy.AppDomainAssemblyCatalog.GetAvailableAssemblies()
at System.Lazy`1.CreateValue()
at System.Lazy`1.LazyInitValue()
at Nancy.DefaultTypeCatalog.GetTypesAssignableTo(Type type)
at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
at Nancy.DefaultTypeCatalog.GetTypesAssignableTo(Type type, TypeResolveStrategy strategy)
at Nancy.Bootstrapper.NancyBootstrapperLocator.GetBootstrapperType(ITypeCatalog typeCatalog)
at Nancy.Bootstrapper.NancyBootstrapperLocator.LocateBootstrapper()
at Nancy.Bootstrapper.NancyBootstrapperLocator.get_Bootstrapper()
因此,显然,当 Nancy 初始化其引导程序时,它会尝试获取其引用程序集并为此使用方法 GetAssemblyDirectories。自然地,DLL 不存在(因为我试图将它们合并到 .exe 中)并且引导程序无法初始化。
由于我无法修复此问题,并且不再维护 Nancy,我想重申我的问题:
有人知道一个不错的 c# 轻量级 Web 框架吗?
我真的不想去寻找其他东西,因为 Nancy
对我来说工作得很好。我最终做的是将 dll 写入我知道 nancy 将要查找它的位置,初始化该引导程序,然后再次删除数据:
bool NancyPresent = File.Exists("Nancy.dll");
if (!NancyPresent) {
var assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream("Resources.Nancy.dll"))
using (MemoryStream MS = new MemoryStream()) {
stream.CopyTo(MS);
File.WriteAllBytes("Nancy.dll", MS.ToArray());
}
Nancy.Bootstrapper.INancyBootstrapper bootstrapper = Nancy.Bootstrapper.NancyBootstrapperLocator.Bootstrapper;
bootstrapper.Initialise();
File.Delete("Nancy.dll");
}
重要信息是 dll 加载正常,尽管 Nancy 的错误提示并非如此。即使它是开源的,你也永远不知道第三方包到底要做什么!
我正在开发一个简单的 WPF 应用程序,它使用两个外部 DLL,Nancy.dll
和 Nancy.Hosting.Self.dll
通过 http 发送一些数据。我想保持 .exe 文件独立,所以我试图将这两个 .dll 文件合并到应用程序中。我尝试了多种 post-build 合并方法,例如 NetZ
和 ILMerge
,但两者似乎都存在 wpf 应用程序问题,并且没有输出有效的可执行文件。
有 this post 有多个解决这个问题的建议,尽管它们都归结为相同的两件事:
- 使用 post-构建合并。这对我来说效果不佳。
- 将DLL作为内嵌资源放入应用程序中,必要时利用
AppDomain.CurrentDomain.AssemblyResolve
事件加载。
第二个选项似乎很有希望:事件被触发,它找到嵌入的资源,从中生成数据流并将其作为程序集加载。我可以验证程序集是否以多种方式加载:
Visual Studio的Debug -> Windows -> Modules
显示加载的程序集,
AppDomain.CurrentDomain.GetAssemblies()
还显示正在加载的程序集。
但是,在使用程序集时(在本例中调用 Nancy.Hosting.Self.NancyHost host = new NancyHost();
),我仍然收到以下错误:
Could not load file or assembly 'Nancy, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
我确实确保也加载了所有依赖项(如建议的那样here)并且所有加载的程序集都在同一个 AppDomain 中。另请注意,上述错误仅适用于 Nancy.dll
,AssemblyResolve
事件确实设法正确加载 Nancy.Hosting.Self.dll
。
我真的不知道我还做错了什么,我加载程序集时是否出了问题,或者南希是否特别表现异常(我发现 this issue on GitHub 其中我'我不确定它是否相关)。如果您对加载程序集、合并 dll 或替代 Nancy 有任何建议,我将非常乐意听到。
P.S.:
我尝试从 Nancy.dll
调用不同的方法,令我惊讶的是我能够; AssemblyResolve
方法确实有效。
初始化 Nancy.Hosting.Self.NancyHost
仍然有问题,堆栈跟踪提示了原因:
at System.AppDomain.CreateInstanceAndUnwrap(String assemblyName, String typeName)
at Nancy.AppDomainAssemblyCatalog.CreateRemoteReferenceProber(AppDomain appDomain)
at Nancy.AppDomainAssemblyCatalog.LoadNancyReferencingAssemblies(IEnumerable`1 loadedAssemblies)
at Nancy.AppDomainAssemblyCatalog.GetAvailableAssemblies()
at System.Lazy`1.CreateValue()
at System.Lazy`1.LazyInitValue()
at Nancy.DefaultTypeCatalog.GetTypesAssignableTo(Type type)
at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
at Nancy.DefaultTypeCatalog.GetTypesAssignableTo(Type type, TypeResolveStrategy strategy)
at Nancy.Bootstrapper.NancyBootstrapperLocator.GetBootstrapperType(ITypeCatalog typeCatalog)
at Nancy.Bootstrapper.NancyBootstrapperLocator.LocateBootstrapper()
at Nancy.Bootstrapper.NancyBootstrapperLocator.get_Bootstrapper()
因此,显然,当 Nancy 初始化其引导程序时,它会尝试获取其引用程序集并为此使用方法 GetAssemblyDirectories。自然地,DLL 不存在(因为我试图将它们合并到 .exe 中)并且引导程序无法初始化。
由于我无法修复此问题,并且不再维护 Nancy,我想重申我的问题:
有人知道一个不错的 c# 轻量级 Web 框架吗?
我真的不想去寻找其他东西,因为 Nancy
对我来说工作得很好。我最终做的是将 dll 写入我知道 nancy 将要查找它的位置,初始化该引导程序,然后再次删除数据:
bool NancyPresent = File.Exists("Nancy.dll");
if (!NancyPresent) {
var assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream("Resources.Nancy.dll"))
using (MemoryStream MS = new MemoryStream()) {
stream.CopyTo(MS);
File.WriteAllBytes("Nancy.dll", MS.ToArray());
}
Nancy.Bootstrapper.INancyBootstrapper bootstrapper = Nancy.Bootstrapper.NancyBootstrapperLocator.Bootstrapper;
bootstrapper.Initialise();
File.Delete("Nancy.dll");
}
重要信息是 dll 加载正常,尽管 Nancy 的错误提示并非如此。即使它是开源的,你也永远不知道第三方包到底要做什么!