使用PreApplicationStartMethod属性发生了奇怪的事情。我确实在我的最新项目中实现了它。在AssemblyInfo.cs中,我有以下几行:
[assembly: PreApplicationStartMethod(typeof(MyAssembly.Initializer), "Initialize")]
类型和方法如下所示:
namespace MyAssembly
{
public static class Initializer
{
public static void Initialize()
{
TranslationKeys.Initialize();
}
}
}
当我重建我的应用程序并在浏览器中加载它时,我收到以下错误:
无法解析程序集“MyWebApp,Version = 0.0.1.0,Culture = neutral,PublicKeyToken = null”上的PreApplicationStartMethodAttribute指定的方法。键入:'MyAssembly.Initializer',MethodName:'Initialize'。验证类型是否为public且方法是public和static(在Visual Basic中为Shared)。
我真的不知道问题是什么。
答案 0 :(得分:10)
奇怪的是,我们在ASP.NET团队中大量使用此功能,并没有遇到过这种情况。为了帮助调试此问题,您是否可以尝试运行以下代码,这类似于ASP.NET用于查找方法的内容?
运行它的最佳方法是创建一个控制台应用程序并将该代码放在那里。然后只需调用它,将它传递给您看到问题的程序集。然后,您需要对其进行调试并仔细跟踪以查看发生了什么。
BTW,在执行此操作之前,请仔细检查您是否将该属性放在包含该类的同一程序集上。即它不能指向不同组件中的类型。
以下是要尝试的代码:
using System;
using System.Web;
using System.Reflection;
public class TestClass {
public static void TestPreStartInitMethodLocation(Assembly assembly) {
var attributes = (PreApplicationStartMethodAttribute[])assembly.GetCustomAttributes(typeof(PreApplicationStartMethodAttribute), inherit: true);
if (attributes != null && attributes.Length != 0) {
PreApplicationStartMethodAttribute attribute = attributes[0];
MethodInfo method = null;
// They must be in the same assembly!
if (attribute.Type != null && !String.IsNullOrEmpty(attribute.MethodName) && attribute.Type.Assembly == assembly) {
method = FindPreStartInitMethod(attribute.Type, attribute.MethodName);
}
if (method == null) {
throw new HttpException("Couldn't find attribute");
}
}
}
public static MethodInfo FindPreStartInitMethod(Type type, string methodName) {
MethodInfo method = null;
if (type.IsPublic) {
method = type.GetMethod(methodName, BindingFlags.Public | BindingFlags.Static | BindingFlags.IgnoreCase,
binder: null,
types: Type.EmptyTypes,
modifiers: null);
}
return method;
}
}
答案 1 :(得分:3)
我有类似的问题。我在不同的程序集中引用了一个类。
因此,在我的Web应用程序中,我创建了一个在单独的程序集中调用该方法的包装器。然后,我在PreApplicationStartMethod属性中引用此包装器。
答案 2 :(得分:2)
第1步: 确保在AssemblyInfo.cs中使用System.Web
第2步:
您还需要右键单击项目“add - > reference”并选择Assemblies - >框架 - >单击“System.Web”。
创建类库时,我总是这样,因为在创建项目时它不会默认这个命名空间。
答案 3 :(得分:0)
我复制了你的代码,它完美无缺。因此,请尝试清理并重建整个应用程序。
您确定自己不在嵌套命名空间中吗?