我的问题与这个问题非常相似,只是答案和解决方法对我不起作用。我也在 Visual Studio 2012 中。
我有一个引用另一个项目的 VSPackage,它依赖于其他 dll。每次我在调试中运行我的包时,我都会收到一个无法找到其他 dll 的异常。它们位于输出目录中,并且已签名。
我尝试通过 VSPackage 项目直接引用它们无济于事。
想法?
我的问题与这个问题非常相似,只是答案和解决方法对我不起作用。我也在 Visual Studio 2012 中。
我有一个引用另一个项目的 VSPackage,它依赖于其他 dll。每次我在调试中运行我的包时,我都会收到一个无法找到其他 dll 的异常。它们位于输出目录中,并且已签名。
我尝试通过 VSPackage 项目直接引用它们无济于事。
想法?
存在此问题的原因是,如果您的扩展程序没有显式依赖这些程序集,Visual Studio 不会在您的扩展程序的文件夹中查找程序集。例如,在配置文件 (IoC config) 或 xaml 代码中设置的依赖关系。我知道这个问题的三个解决方案:
您可以在 GAC 中部署这些程序集,Visual Studio 将加载它们。如果您使用为在 GAC 中使用而构建的第三方库(例如 MS Enterprise Library),则此方法很好。但是VSIX 部署包不允许在 GAC 中安装程序集,您可以使用 MSI 安装程序。
对于 Visual Studio 2010/2012 的 VSPackages,您可以使用ProvideBindingPath属性。扩展所在的路径将添加到 Visual Studio 用于查找依赖程序集的路径中。如果您的扩展不包含 VSPackage,您可以将此属性添加到任何公共类(请参阅此处)。
[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() 方法中)