none
为什么我用反射的方式加载WebBrowser - ActiveX 就会出现 System.IO.FileNotFoundException ? RRS feed

  • 问题

  • 如果我利用反射的方式加载WebBrowser控件或者利用反射的方式加载包含有AxWebBrowser实例的类的时候, 就会出现以下异常:


    [System.IO.FileNotFoundException]

    未能加载文件或程序集“AxInterop.SHDocVw, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件。":"AxInterop.SHDocVw, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null


    Fusion Log:

    === 预绑定状态信息 ===
    日志: 用户 = F9-JR305\Administrator
    日志: DisplayName = AxInterop.SHDocVw, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null
     (Fully-specified)
    日志: Appbase = file:///R:/CTR6004/SystemManager/Compiled/
    日志: 初始 PrivatePath = NULL
    调用程序集: (Unknown)。
    ===
    日志: 此绑定从 default 加载上下文开始。
    日志: 未找到应用程序配置文件。
    日志: 使用 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config 的计算机配置文件。
    日志: 此时没有为引用应用策略(私有、自定义、分部或基于位置的程序集绑定)。
    日志: 相同的绑定已出现过,因 hr = 0x80070002 而失败。




    ----------------------
    以下是调用部分代码
    ----------------------



    被调用的函数:

    /// <summary>
    /// 根据给定的类型在指定程序集中搜索所有该类型的子类, 并创建实例.
    /// <summary>
    /// <typeparam name="T">给定的类型</typeparam>
    /// <param name="AssemblyPath">程序集物理路径</param>
    /// <returns>实例</returns>
    public static T[] GetImplementations<T>(String assemblyPath)
    {
        Type typeOfParam = typeof(T);

        if (typeOfParam.IsEnum)
            return new T[0];

        Boolean isInterface = typeOfParam.IsInterface;

        try
        {

            Assembly assembly = Assembly.LoadFile(assemblyPath);


            List<Type> types = new  List<Type>();
            Module[] modules = assembly.GetModules(false);


            foreach (Module m in modules)
            {
                Type[] t =m.GetTypes();

                foreach (Type i in t)
                    if (IsImplemented(i, typeOfParam))
                        types.Add(i);
            }

            

            List<T> objs = new  List<T>();

            foreach (Type type in types)
            {
                try
                {
                    T o = (T)type.Assembly.CreateInstance(type.FullName);

                    objs.Add(o);
                }
                catch { } //此处抛出异常
            }

            return objs.ToArray();

        }
        catch
        {
            return new  T[0];
        }
    }




    要获取的类:

    public class MSPPTPlayer:MediaPlayer
    {
      AxSHDocVw.AxWebBrowser webBrowserControl = new AxSHDocVw.AxWebBrowser();   Microsoft.Office.Interop.PowerPoint.Presentation document;
      //... Other code
    }




    调用方部分代码:

    System.Collections.ArrayList list= new System.Collections.ArrayList(System.IO.Directory.GetFiles(path, "*.dll"));
    list.AddRange(System.IO.Directory.GetFiles(path,"*.exe"));

    List<MediaPlayer> result = new List<MediaPlayer>();
    for (int i =0;i<list.Count;i++)
    {
       Object o = list[i];

       MediaPlayer[] found = Utility.GetImplementations<MediaPlayer>(o.ToString());
       result.AddRange(found.ToList<MediaPlayer>());
    }



    在此请教各位大师, 这是什么原因? 应该如何解决? 小弟先行谢过.
    2010年1月19日 7:21

答案

  • 你好!
    是不检测版本的,我上面的建议有些问题!
    实际上我还是感觉是路径的问题,你把assemblyPath输出,看看到底是什么!
    周雪峰
    2010年1月19日 12:32
    版主

全部回复

  • 你好!
         你检查一下,你的exe的同一个目录下是否存在AxInterop.SHDocVw.dll这个程序集?
    周雪峰
    2010年1月19日 7:36
    版主
  • 存在. 确认有AxInterop.SHDocVw.dll
    哈哈哈哈
    2010年1月19日 7:51
  • 你好!
    再检查一下:
    Assembly  assembly = Assembly .LoadFile(assemblyPath);
    中的assemblyPath,是否和你期望的值相同!
    周雪峰
    2010年1月19日 8:08
    版主
  • 你好!
    再检查一下:
    Assembly  assembly = Assembly .LoadFile(assemblyPath);
    中的assemblyPath,是否和你期望的值相同!
    周雪峰

    是的. 没错. 否则返回值应该是空的.
    哈哈哈哈
    2010年1月19日 8:27
  • 你好!
         程序集的版本一致吗?
    周雪峰
    2010年1月19日 9:03
    版主
  • 你好!
         程序集的版本一致吗?
    周雪峰
    你好, 这个不应该检测版本啊~ 奇怪..
    哈哈哈哈
    2010年1月19日 9:28
  • 你好!
    是不检测版本的,我上面的建议有些问题!
    实际上我还是感觉是路径的问题,你把assemblyPath输出,看看到底是什么!
    周雪峰
    2010年1月19日 12:32
    版主