0

我有一些代码

var type = Type.GetType("namespace, assembly");
return Activator.CreateInstance(type);

这在大多数情况下都可以正常工作,但是当在使用 Cassini/Visual Studio 开发服务器调试的网站的 Global.asax 中引用此代码时,找不到该类型。

该类型位于未引用的程序集中,但通常与正在执行的程序集位于同一输出目录中。然而,仔细检查后发现,在调试 Cassini 期间,将执行程序集和每个引用的程序集放入其自己的目录中,位于以下位置 C:\users...\AppData\Local\Temp\Temporary ASP.NET Files\root... ..但是显然“未引用”程序集不存在。

有没有办法让 VS 将额外资源复制到临时目录中,或者从指定目录运行?使用 IIS 是唯一的解决方案吗?

提前致谢。

4

2 回答 2

1

我认为这不是 Cassini 所做的,这是 ASP.NET 使用 .NET 卷影复制来防止锁定您的 DLL。因此,使用 IIS 不应该改变任何东西。缺少显式引用似乎让 .NET 将 DLL 放在不同的目录中。

你能把这个引用的 DLL 放在 GAC 中吗?

于 2010-02-25T00:03:58.230 回答
0

这是对您对第一个答案的评论的回应(“有人有其他可能的解决方案吗?”)...

是的,有一个非常简单的解决方案,它来自导致“问题”的同一来源(剧透......它的 System.AppDomain)。AppDomain 类中有一个名为“AssemblyResolve”的事件,您可以响应该事件(使用 AppDomain.CurrentDomain 获取“您的”AppDomain 实例)。该事件将为您提供它无法找到的程序集的名称(字符串)。我假设您确实知道相关程序集的位置,因此只需使用 System.Reflection.Assembly.Load(pathToYourAssembly) 加载程序集,然后返回“加载”方法返回的程序集实例。“AssemblyResolve”事件处理程序有点不同。它有一个返回类型,因此在您的事件处理程序中,您将执行“return thisAssembly;” “这个程序集”在哪里 是 Load 方法的返回值。AppDomain 还有一个 TypeResolve 事件(和其他事件),以防它在“应该在”的程序集中找不到类型。如果您将一个类型从一个程序集移动到另一个程序集并且没有重新编译引用该类型的所有其他内容,则可能会发生这种情况。无论如何,希望对某人有所帮助。我知道这是一个老问题。

于 2014-05-06T05:45:28.017 回答