System.IO.FileNotFoundException:无法加载文件或程序集

时间:2011-05-17 15:21:15

标签: c# .net wpf vb.net

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

3 个答案:

答案 0 :(得分:4)

转到输出目录,使用http://www.dependencywalker.com遍历所有DLL。找到丢失的dll,使用异常为您提供良好的起始位置。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

我以这种方式使用了来自不同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) on see here how)并打开 Debug-&gt; windows- &gt;模块列表,我发现DllName2尚未加载,但第二次加载。

在我的审判期间&amp;错误,我咨询了一位朋友(user1151392),发现如果我使用DllName2中的一个虚拟类,则会在第一次加载Dll。

以下是我最终得到的结果:                                    

    <DockPanel>
        <!-- weird enough, but that fixed my issue -->
        <dll2alias:SomePublicClass />

        <TextBlock Text="test" Style="{StaticResource ResourceKey=SomeResourceFromOtherDLL}" />
    </DockPanel>
</UserControl>

所以,我猜想为Resources加载dll的机制与加载Instances的机制不同。

谢谢user1151392