相关疑难解决方法(0)

如何调试Visual Studio扩展

我只是为Visual Studio 2010编写VSIX扩展,无法弄清楚如何调试它.

一种显而易见的方法是输出消息.扩展模板使用Trace.WriteLine().但在哪里可以找到它的输出?

debugging visual-studio vsix visual-studio-extensions

91
推荐指数
2
解决办法
3万
查看次数

Visual Studio插件的依赖注入

我正在开发一个visual studio插件,它在你的项目中接受SQL查询,播放请求并为结果生成一个C#包装器类.我想做一个最简单的依赖注入,其中使用我的加载项的项目提供了一个类,可以提供项目的数据库连接字符串等.

此接口在我的加载项中定义...

[Serializable]
public interface IDesignTimeQueryProcessing
{
    public string ConnectionString { get; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

问题是:如何定义和实例化具体实现,然后从加载项中使用它?

进展?

上面的接口在加载项中定义.我在目标项目中创建了一个对加载项的引用,编写了具体的实现,并将此类的名称放在目标项目web.config中.现在我需要从加载项加载目标项目以使用我的具体类.

如果我使用Assembly.Load()...

var userAssembly = Assembly.LoadFrom(GetAssemblyPath(userProject));
IQueryFirst_TargetProject iqftp = (IQueryFirst_TargetProject)Activator.CreateInstance(userAssembly.GetType(typeName.Value));
Run Code Online (Sandbox Code Playgroud)

我可以成功加载我的类,但我锁定目标程序集,不能再编译目标项目.

如果我创建一个临时的应用程序域 ...

AppDomain ad = AppDomain.CreateDomain("tmpDomain", null, new AppDomainSetup { ApplicationBase = Path.GetDirectoryName(targetAssembly) });
byte[] assemblyBytes = File.ReadAllBytes(targetAssembly);
var userAssembly = ad.Load(assemblyBytes);
Run Code Online (Sandbox Code Playgroud)

我在调用ad.Load()时得到一个文件未找到异常,即使我的dll的字节在内存中.

如果我使用CreateInstanceFromAndUnwrap()...

AppDomain ad = AppDomain.CreateDomain("tmpDomain", null, new AppDomainSetup { ApplicationBase = Path.GetDirectoryName(targetAssembly) });
IQueryFirst_TargetProject iqftp = (IQueryFirst_TargetProject)ad.CreateInstanceFromAndUnwrap(targetAssembly, typeName.Value);
Run Code Online (Sandbox Code Playgroud)

我得到了

InvalidCastException的."无法转换透明代理以键入QueryFirst.IQueryFirst_TargetProject"

这让我觉得我非常接近?为什么使用Assembly.Load()进行显式转换可以正常工作,但是在新创建的AppDomain中加载相同的程序集时会失败?

c# visual-studio-addins visual-studio

5
推荐指数
1
解决办法
881
查看次数