我的问题是非常相似, 这其中 ,只有答案和解决方法不是为我工作。 另外我在Visual Studio 2012。
我有被引用另一个项目,这是依赖于其他DLL一个VSPackage的。 每次时间我在调试运行我的包,我得到一个例外,其他的dll无法找到。 他们是在输出目录,他们签名。
我试图通过VSPackage的项目无济于事直接引用他们。
思考?
我的问题是非常相似, 这其中 ,只有答案和解决方法不是为我工作。 另外我在Visual Studio 2012。
我有被引用另一个项目,这是依赖于其他DLL一个VSPackage的。 每次时间我在调试运行我的包,我得到一个例外,其他的dll无法找到。 他们是在输出目录,他们签名。
我试图通过VSPackage的项目无济于事直接引用他们。
思考?
存在此问题,因为Visual Studio是没有扩展的文件夹中寻找组件,如果你的扩展没有对这些组件明确依赖。 例如,在一个配置文件(配置的IoC)或XAML代码依赖性设置。 我知道三种解决这个问题:
您可以部署在GAC和Visual Studio这些组件将加载它们。 如果您使用在GAC(例如MS企业库)使用内置第三方库这是一个好方法。 但VSIX部署包不允许在GAC中安装组件,您可以使用MSI安装程序。
对于的VSPackage的Visual Studio 2010/2012可以使用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;
}
}
这个类必须在第一次调用问题组装之前创建(例如,在包装::初始化()方法)