【问题标题】:FileNotFoundException with Assembly.LoadFile on Windows 7 64 bit在 Windows 7 64 位上带有 Assembly.LoadFile 的 FileNotFoundException
【发布时间】:2012-04-10 07:56:50
【问题描述】:

我正在尝试加载一个混合的托管/本机 dll,我将其编译为 32 位和 64 位。 如果我在 Windows 7 32 位上运行我的程序,我可以毫无问题地加载 32 位 dll。如果我加载 64 位 dll,我会得到 BadImageFormatException,这是我所期望的。

我遇到的问题是当我在 Windows 7 64 位下做同样的测试时:

如果我加载 32 位 dll,我会得到 BadImageFormatException。到目前为止还可以。

但如果我加载 64 位 dll,我会得到 FileNotFoundException。而且这个信息是不正确的,因为我事先检查了这个 dll 的存在!

谁能告诉我,为什么我不能在 windows 7 64 位下加载我的 64 位 dll?

这是我的示例代码:

    private void Button32_Click(object sender, RoutedEventArgs e)
    {
        string path = System.IO.Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "x86", "Native.dll");
        LoadAssembly(path);
    }
    private void Button64_Click(object sender, RoutedEventArgs e)
    {
        string path = System.IO.Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "amd64", "Native.dll");
        LoadAssembly(path);
    }

    void LoadAssembly(string path)
    {
        if(File.Exists(path))
        {
            MessageBox.Show("Loading " + path);
            Assembly asm = null;
            try
            {
                asm = Assembly.LoadFile(path);
            }
            catch(Exception ex)
            {
                MessageBox.Show("Exception!!!\n" + ex);
            }
            MessageBox.Show("Success " + (asm == null ? "no" : "yes"));
        }
    }

【问题讨论】:

    标签: c# .net 64-bit assemblies


    【解决方案1】:

    您应该尝试知道哪个程序集无法加载,因为您尝试加载的程序集可能包含无法找到的引用。或存在参考,但适用于 32 位,而不是 64 位版本

    尝试使用Fusion log 来准确了解缺少哪个程序集

    【讨论】:

    • 您的回答将我带到了 Suzanne Cook 的博客blogs.msdn.com/b/suzcook/archive/2003/05/29/57120.aspx,它帮助我找到了解决方案。本机 dll 引用了系统上缺少的 msvcr100.dll。 Fusion 日志在这里没有帮助,但 Dependency Walker 有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    相关资源
    最近更新 更多