VSIX - 无法加载参考DLL文件或程序集(VSIX - Cannot load file or

2019-07-04 09:27发布

我的问题是非常相似, 这其中 ,只有答案和解决方法不是为我工作。 另外我在Visual Studio 2012。

我有被引用另一个项目,这是依赖于其他DLL一个VSPackage的。 每次时间我在调试运行我的包,我得到一个例外,其他的dll无法找到。 他们是在输出目录,他们签名。

我试图通过VSPackage的项目无济于事直接引用他们。

思考?

Answer 1:

存在此问题,因为Visual Studio是没有扩展的文件夹中寻找组件,如果你的扩展没有对这些组件明确依赖。 例如,在一个配置文件(配置的IoC)或XAML代码依赖性设置。 我知道三种解决这个问题:

  1. 您可以部署在GAC和Visual Studio这些组件将加载它们。 如果您使用在GAC(例如MS企业库)使用内置第三方库这是一个好方法。 但VSIX部署包不允许在GAC中安装组件,您可以使用MSI安装程序。

  2. 对于的VSPackage的Visual Studio 2010/2012可以使用ProvideBindingPath属性。 在您的扩展所在的路径将被添加到路径的Visual Studio使用查找依赖程序集。 如果您的扩展不包括VSPackage的,可以将此属性添加到任何公共类( 见这里 )。

     [ProvideBindingPath] public class MyVsPackage : Package { /* ... */ } 
  3. 您可以手动解决程序集名称。 要做到这一点,你需要订阅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;
    }
}

这个类必须在第一次调用问题组装之前创建(例如,在包装::初始化()方法)



文章来源: VSIX - Cannot load file or assembly of a referenced dll