【发布时间】:2013-09-18 14:13:19
【问题描述】:
以前版本的 Autofac 可以工作,但由于他们切换到使其成为可移植类库,因此无法加载。
我尝试应用列出的修复程序 here (KB2468871),但它告诉我不需要它。
当我将 Autofac.dll 文件移动到与可执行文件相同的位置时,错误消失了。当它从外部 DLL 加载它时,它加载正常。
为什么它不能作为嵌入式 DLL 工作?
这是一个例外:
System.IO.FileNotFoundException: Could not load file or assembly 'System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes' or one of its dependencies. The system cannot find the file specified.
Stack trace:
at Autofac.Core.Registration.ComponentRegistration..ctor(Guid id, IInstanceActivator activator, IComponentLifetime lifetime, InstanceSharing sharing, InstanceOwnership ownership, IEnumerable`1 services, IDictionary`2 metadata)
at Autofac.Core.Container..ctor()
at Autofac.ContainerBuilder.Build(ContainerBuildOptions options)
at MyApp.Configuration.Bootstrapper.Run(String[] args) in c:\Dev\MyApp\App\Configuration\Bootstrapper.cs:line 25
at MyApp.Configuration.EntryPoint.Main(String[] args) in c:\Dev\MyApp\App\Configuration\EntryPoint.cs:line 22
如果有帮助,下面是 .csproj 文件中将 DLL 嵌入可执行文件的部分:
<Target Name="AfterResolveReferences">
<ItemGroup>
<EmbeddedResource Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.Extension)' == '.dll'">
<LogicalName>%(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)</LogicalName>
</EmbeddedResource>
</ItemGroup>
...这里是 EntryPoint 类:
internal static class EntryPoint
{
[STAThread]
private static void Main(params string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => loadEmbeddedAssembly(e.Name);
Bootstrapper.Run(args); // must call separate class when using embedded assemblies
}
private static Assembly loadEmbeddedAssembly(string name)
{
var container = Assembly.GetExecutingAssembly();
var path = new AssemblyName(name).Name + ".dll";
using (var stream = container.GetManifestResourceStream(path))
{
if (stream == null)
{
return null;
}
var bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
return Assembly.Load(bytes);
}
}
}
【问题讨论】:
-
看起来您的程序集解析处理程序没有运行。你能证实这一点吗?此外,仅使用设计器将文件添加为资源要容易得多。您可以通过 byte[] 属性 [root namespace].Properties.Resources.SomeEmbeddedFile 访问它。在 MemoryStream 中猛击它并完成它。 GMRS 是老派。
-
@Will 如果程序集解析处理程序没有运行,它将根本无法加载 Autofac。 Autofac 正在加载,它只是试图加载旧版本的 System.Core。当它作为嵌入式资源加载时,似乎程序集的 Retargetable 属性不起作用。当我将 Autofac dll 复制到与 exe 相同的文件夹中时,它确实有效。
-
哦,明白了。可能与加载上下文有关。它们很难理解,而且根本没有很好的记录。试过自己加载吗?
-
看起来类似于this question。在 cmets 中,leppie 建议使用
LoadFrom,这似乎对提问者有用。
标签: c# dll embedded-resource