visual-studio-2012 - VSIX - 无法加载引用的 dll 的文件或程序集

标签 visual-studio-2012 vsix vspackage

我的问题与 this one 非常相似,只是答案和解决方法对我不起作用。我也在 Visual Studio 2012 中。

我有一个引用另一个项目的 VSPackage,它依赖于其他 dll。每次我在调试中运行我的包时,我都会收到一个无法找到其他 dll 的异常。它们位于输出目录中,并且已签名。

我尝试通过 VSPackage 项目直接引用它们无济于事。

想法?

最佳答案

存在此问题的原因是,如果您的扩展程序没有显式依赖这些程序集,Visual Studio 不会在您的扩展程序的文件夹中查找程序集。例如,在配置文件 (IoC config) 或 xaml 代码中设置的依赖关系。我知道这个问题的三种解决方案:

  • 您可以在 GAC 中部署这些程序集,Visual Studio 将加载它们。如果您使用为在 GAC 中使用而构建的第三方库(例如 MS Enterprise Library),则此方法很好。但是VSIX Deployment Package不允许在 GAC 中安装程序集,您可以使用 MSI 安装程序。
  • 对于 Visual Studio 2010/2012 的 VSPackages,您可以使用 ProvideBindingPath属性。扩展所在的路径将添加到 Visual Studio 用于查找依赖程序集的路径中。如果您的扩展不包含 VSPackage,您可以将此属性添加到任何公共(public)类 (see here)。
    [ProvideBindingPath] 
    public class MyVsPackage : Package 
    { /* ... */ }
    
  • 您可以手动解析程序集名称。为此,您需要订阅 AssemblyResolve 事件,并且需要从处理程序返回所需的程序集。这是最灵活的方式,如果你不能使用以前的方法,这特别适合你。
    在我的 IntelliDebugger 项目中,我为它编写了一个类 ManualAssemblyResolver:

  • using System;
    using System.Reflection;
        
    namespace IntelliEgg.Debugger.Utility
    {
        public class ManualAssemblyResolver : IDisposable
        {
            public ManualAssemblyResolver(Assembly assembly)
            {
                if (assembly == null)
                    throw new ArgumentNullException("assembly");
    
                _assemblies = new[] {assembly};
                AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve;
            }
    
            public ManualAssemblyResolver(params Assembly[] assemblies)
            {
                if (assemblies == null)
                    throw new ArgumentNullException("assemblies");
    
                if (assemblies.Length == 0)
                    throw new ArgumentException("Assemblies should be not empty.", "assemblies");
    
                _assemblies = assemblies;
                AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve;
            }
    
            public void Dispose()
            {
                AppDomain.CurrentDomain.AssemblyResolve -= OnAssemblyResolve;
            }
    
            private Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
            {
                foreach (Assembly assembly in _assemblies)
                {
                    if (args.Name == assembly.FullName)
                    {
                        return assembly;
                    }
                }
    
                return null;
            }
    
            private readonly Assembly[] _assemblies;
        }
    }
    
    必须在第一次调用问题程序集之前创建此类(例如,在 Package::Initialize() 方法中)

    关于visual-studio-2012 - VSIX - 无法加载引用的 dll 的文件或程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13674782/

    相关文章:

    visual-studio - 如何使我的 VSIX 文件与 VS11 和 VS2010 兼容?

    c# - VSCT 未定义 'Parent/@id' 属性

    visual-studio-extensions - Visual Studio 扩展 : Get the path of the current selected file in the Solution Explorer

    c# - VSIX 项目上下文菜单

    c# - Visual Studio 测试、Process.Start、SQLCMD 和 Windows 命令处理器错误

    visual-studio-2012 - "The following path contains more than the allowed 259 characters"删除文件时门控构建

    c# - 转向资源重构

    javascript - 操作 HTML/CSS 的 VS 扩展

    tfs - Visual Studio 2012 - 如何将我的解决方案绑定(bind)到另一个 Team Foundation 服务器?