Mar*_*inF 5 .net add-in codedom compilation .net-assembly
我正在尝试使用CodeDomProvider在运行时将一些代码编译到内存中.
我正在编译的代码引用了一个外部程序集,我在编译代码时使用的参数中包含了该代码.
当我编译到内存并尝试对Visual Studio加载项中生成的程序集使用反射时,它会抛出一个异常,说它无法找到引用的程序集.
(例外)
"无法加载一个或多个请求的类型.检索LoaderExceptions属性以获取更多信息."
(LoaderException)
"{"无法加载文件或程序集'Dynamo.Jiss.Task,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一.系统找不到指定的文件.":"Dynamo.Jiss.Task,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null"}"
我尝试使用绝对路径从不同的地方引用程序集.
如果从控制台应用程序运行,完全相同的代码工作正常,如果我不编译到内存,它也可以在加载项中正常工作.
删除对外部程序集的引用以及引用它的代码在编译到内存时也有效,因此异常描述可能是加载引用程序集时出现的问题.
有没有人知道为什么编译内存和引用程序集不能在加载项中工作?
它正在运行的AppDomain中是否存在某些限制或我应该注意哪些内容?(我目前最好的猜测)
它应该在特定文件夹中吗?使用相对路径引用?安全设定?需要签名吗?有任何想法吗?
我想要实现的是一种方法,将具有特定扩展名的文件放在项目中,让addin自动编译它,如果它实现了ITask接口(来自外部程序集),它将调用一个Setup()方法来实现它代码可以在侦听不同事件时挂钩到Visual Studio事件并执行任务/脚本.这样,如果更改了另一个文件,我可以轻松执行文本模板,或者在不同事件(文档保存,构建等)上组合和缩小文件.
这样的事情是否已经存在(为了减轻我的痛苦)?:)
这很有可能发生,因为你告诉CodeDom生成一个内存中的程序集(这实际上是一个谎言,因为它临时生成磁盘,加载它,然后删除文件).关键是,CodeDom程序集的编译目录与您用于编译它的目录不同.也就是说,如果您在bin\Debug中运行,则CodeDom程序集将生成为%temp%.
您可以通过以下两种方式解决此问题:
将CodeDom程序集编译为与执行程序集相同的路径.
myCodeProvider.GenerateInMemory = false; // may not be necessary...haven't tried this in a while
myCodeProvider.OutputAssembly = string.Format(@"{0}\{1}", Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location, "mydll.dll");
Run Code Online (Sandbox Code Playgroud)处理AssemblyResolve事件并为CodeDom程序集提供所请求的引用程序集.
AppDomain.CurrentDomain.AssemblyResolve += OnCurrentDomainAssemblyResolve
private static Assembly OnCurrentDomainAssemblyResolve(object sender, ResolveEventArgs args)
{
// this is absurdly expensive...don't do this more than once, or load the assembly file in a more efficient way
// also, if the code you're using to compile the CodeDom assembly doesn't/hasn't used the referenced assembly yet, this won't work
// and you should use Assembly.Load(...)
foreach (Assembly @assembly in AppDomain.CurrentDomain.GetAssemblies())
{
if (@assembly.FullName.Equals(args.Name, StringComparison.OrdinalIgnoreCase))
{
return @assembly;
}
}
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
4056 次 |
| 最近记录: |