PreApplicationStartMethod属性导致异常

时间:2010-05-21 08:21:19

标签: c# asp.net .net-4.0

使用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)。

我真的不知道问题是什么。

4 个答案:

答案 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)

我复制了你的代码,它完美无缺。因此,请尝试清理并重建整个应用程序。

您确定自己不在嵌套命名空间中吗?