【发布时间】:2016-01-27 11:19:22
【问题描述】:
我正在开发一个 Visual Studio 加载项,该加载项在您的项目中接受 SQL 查询、播放请求并为结果生成一个 C# 包装类。我想做一个最简单的依赖注入,其中使用我的加载项的项目提供一个可以提供项目的数据库连接字符串等的类。
这个接口是在我的插件中定义的...
[Serializable]
public interface IDesignTimeQueryProcessing
{
public string ConnectionString { get; }
...
}
问题是:如何定义和实例化具体实现,然后从插件中使用它?
进展?
上面的接口是在插件中定义的。我在目标项目中创建了对加载项的引用,编写了具体的实现,并将这个类的名称放在目标项目的 web.config 中。现在我需要从加载项加载目标项目以使用我的具体类。
如果我使用 Assembly.Load()...
var userAssembly = Assembly.LoadFrom(GetAssemblyPath(userProject));
IQueryFirst_TargetProject iqftp = (IQueryFirst_TargetProject)Activator.CreateInstance(userAssembly.GetType(typeName.Value));
我可以成功加载我的类,但是我锁定了目标程序集,无法再编译目标项目。
If I create a temporary app domain...
AppDomain ad = AppDomain.CreateDomain("tmpDomain", null, new AppDomainSetup { ApplicationBase = Path.GetDirectoryName(targetAssembly) });
byte[] assemblyBytes = File.ReadAllBytes(targetAssembly);
var userAssembly = ad.Load(assemblyBytes);
我在调用 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);
我得到一个
InvalidCastException。 "无法将透明代理转换为 QueryFirst.IQueryFirst_TargetProject"
这让我觉得我很亲密?为什么使用 Assembly.Load() 显式转换可以正常工作,但在新创建的 AppDomain 中加载相同的程序集时会失败?
【问题讨论】:
标签: c# visual-studio visual-studio-addins