【问题标题】:System.IO.FileNotFoundException: Could not load file or assemblySystem.IO.FileNotFoundException:无法加载文件或程序集
【发布时间】:2011-05-17 15:21:15
【问题描述】:

我有一个 WPF 应用程序,它在解决方案中有 3 个项目。我有主菜单,它是实际的 EXE、报告 DLL 和应用程序文件 DLL,它们都是 WPF 类库。当我尝试从应用程序文件 DLL 中使用第 3 方报告工具时,我收到了 System.IO 错误。我引用了第 3 方 DLL,并设置为在我的应用程序 DLL 中复制本地。如果我在 EXE 项目中引用第 3 方报告工具,一切正常,但我不想这样做。我希望我的 DLL 是独立的,以便其他人可以引用我的 DLL,而无需添加除我的 DLL 之外的任何内容。任何人都知道我可能需要做些什么来解决这个问题?谢谢

【问题讨论】:

  • 会不会是第三方DLL有依赖,而FileNotFound是你部署时依赖丢失的结果?
  • @Smudge202 - 这是个好主意。我总是被困在这一点上。错误说它无法加载一个 DLL,但实际上它意味着它找不到那个 DLL 的依赖项。

标签: c# .net wpf vb.net


【解决方案1】:

转到您的输出目录并使用http://www.dependencywalker.com 遍历所有 DLL。找到丢失的dll,利用异常给你一个好的起始位置。

我不相信你想做的事是可能的。如果您的 DLL 依赖于其他 DLL,那么您的 DLL 需要访问其他 DLL。您不能简单地将其他 DLL 构建到您的 DLL 中。

【讨论】:

  • 这也是我想知道的,如果它甚至可能的话。将 dll 打包到 dll 中,使使用父 dll 的 exe 不知道 dll 中的内容...
  • 实际上,您可以使用 ILMerge 将多个 .NET 程序集组合成一个程序集。
【解决方案2】:

复制本地意味着它将被复制到当前项目的 bin 文件夹中,在应用程序文件的情况下,它会将其复制到应用程序文件的 bin 文件夹中,这不是您想要的。

尝试将应用程序文件的输出路径(项目上的右键单击属性 -> 构建)更改为 exe 项目的 bin 路径

【讨论】:

    【解决方案3】:

    我以这种方式使用了来自不同 dll 的ResourceDictionary

    <UserControl x:Class="DllName1.Class1" .......>
        <UserControl.Resources>
            <ResourceDictionary Source="pack://application:,,,/DllName2;component/Resources/ResourceStyleDictionaryFileName.xaml" />
        </UserControl.Resources>
    
        <DockPanel>
            <TextBlock Text="test" Style="{StaticResource ResourceKey=SomeResourceFromOtherDLL}" />
        </DockPanel>
    </UserControl>
    

    我得到了非常相同的错误,但只是在 第一次加载 Class1 时。 从第二次开始,它完美无瑕。

    所以,我打开了程序集绑定失败日志记录 (Fusion)开启 (see here how) 并打开了Debug->windows->Modules列表,我发现DllName2还没有加载,但是第二次加载了。

    在试错过程中,我咨询了一位朋友 (user1151392),发现如果我使用 DllName2 中的一些虚拟类,Dll 将在第一时间加载。

    这是我最终得到的结果:

        <DockPanel>
            <!-- weird enough, but that fixed my issue -->
            <dll2alias:SomePublicClass />
    
            <TextBlock Text="test" Style="{StaticResource ResourceKey=SomeResourceFromOtherDLL}" />
        </DockPanel>
    </UserControl>
    

    所以,我猜想为资源加载 dll 的机制与加载实例的机制不同。

    谢谢user1151392

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      • 2012-12-28
      • 2016-08-16
      • 2015-07-28
      相关资源
      最近更新 更多