Использование ELMAH с ASP.NET MVC в VB: Компиляция: у Elmah нет строгого имени

Я прочитал сообщения и код для передачи ошибок ASP.NET MVC HandleError в ELMAH и преобразовал код в VB:

Imports System
Imports System.Web
Imports System.Web.Mvc
Imports Elmah

Public Class HandleErrorAttribute
    Inherits System.Web.Mvc.HandleErrorAttribute
    Public Overrides Sub OnException(ByVal context As ExceptionContext)

        MyBase.OnException(context)

        Dim e As Exception = context.Exception
        If Not context.ExceptionHandled OrElse RaiseErrorSignal(e) OrElse IsFiltered(context) Then
            ' if unhandled, will be logged anyhow
            'prefer signaling, if possible
            'filtered?
        Else
            LogException(e)
        End If
    End Sub

    Private Function RaiseErrorSignal(ByVal e As Exception) As Boolean
        Dim context = HttpContext.Current
        If context Is Nothing Then Return False

        Dim signal = ErrorSignal.FromContext(context)
        If signal Is Nothing Then Return False

        signal.Raise(e, context)
        Return True
    End Function

    Private Function IsFiltered(ByVal context As ExceptionContext) As Boolean
        Dim config As ErrorFilterConfiguration = context.HttpContext.GetSection("elmah/errorFilter")

        If config Is Nothing Then Return False

        Dim testContext = New ErrorFilterModule.AssertionHelperContext(context.Exception, HttpContext.Current)

        Return config.Assertion.Test(testContext)
    End Function

    Private Sub LogException(ByVal e As Exception)

        Dim context = HttpContext.Current
        ErrorLog.GetDefault(context).Log(New Elmah.Error(e, context))
    End Sub

End Class

Однако я заметил, что когда я пытаюсь скомпилировать код, я получаю следующую ошибку от VS2008:

Error  3   Unable to emit assembly: Referenced assembly 'Elmah' does not have a strong name    Main

Прямо сейчас HandleErrorAttribute.vb находится в [папке с файлом SLN]\Main\HandleErrorAttribute.vb, а представления, контроллеры и т. д. находятся в основной папке.

Если вам удалось заставить работать исходный код C#, как вы обошли ошибку времени компиляции? (и, если вы заставили его работать в VB, это даже лучше)

Изменить

Я уже пытался подписать его с помощью sn.exe:

C:\Program Files\Microsoft Visual Studio 9.0\VC>sn -R "C:\Documents and Settings
\zchoy\My Documents\Burrow\Code\Main\lib\Elmah.dll" "C:\documents and settings\z
choy\my documents\burrow\code\code signing key.pfx"

Microsoft (R) .NET Framework Strong Name Utility  Version 3.5.30729.1
Copyright (c) Microsoft Corporation.  All rights reserved.

C:\Documents and Settings\zchoy\My Documents\Burrow\Code\Main\lib\Elmah.dll does
 not represent a strongly named assembly

Явно бесполезен.


person Zian Choy    schedule 27.08.2009    source источник


Ответы (2)


Когда у меня возникла эта проблема, я загрузил исходный код ELMAH и открыл его в Визуальная студия. Затем я использовал вкладку «Подписание» в свойствах проекта, чтобы подписать сборку, а затем скомпилировал собственную версию Elmah.dll.

Затем я связал эту подписанную версию со своим основным проектом.

person Joel Mueller    schedule 27.08.2009
comment
Это нормально, если у вас есть исходный код. В общем, al.exe — это решение. - person Steven Sudit; 04.09.2009
comment
Можете ли вы подробно описать точный синтаксис использования al.exe для подписи скомпилированной сборки (не модуля), которая не помечена для отложенной подписи? Я не могу заставить его работать, и я не вижу ничего в документации для al.exe, что заставляет меня думать, что это должно работать. В прошлом мне приходилось прибегать к ILDASM/ILASM, чтобы получить подписанную версию сборки, для которой у меня не было исходного кода, и если бы для этого работал al.exe, это было бы намного проще. - person Joel Mueller; 04.09.2009
comment
@Joel: Согласно devnewsgroups.net/group/microsoft.public .dotnet.framework/, точнее будет сказать, что al.exe позволяет создать новую подписанную сборку, а не подписывать существующую. - person Steven Sudit; 04.09.2009
comment
Я согласен, Стивен. В этом потоке, на который вы ссылаетесь, также говорится: «Вы не можете подписать существующую неподписанную сборку с помощью Al.exe». Вы как бы утверждаете обратное, что было бы очень удобно, поэтому я и попросил привести пример. - person Joel Mueller; 04.09.2009

Похоже, вам нужно подписать сборку Elmah, чтобы она имела строгое имя.

person Steven Sudit    schedule 27.08.2009
comment
К сожалению, sn.exe выдает это, когда я пытаюсь его подписать: ›sn -RC:\Documents and Settings \zchoy\My Documents\Burrow\Code\Main\lib\Elmah.dll C:\documents and settings\z choy\my document\burrow\code\code signing key.pfx Microsoft (R) .NET Framework Strong Name Utility Версия 3.5.30729.1 Copyright (c) Microsoft Corporation. Все права защищены. C:\Documents and Settings\zchoy\My Documents\Burrow\Code\Main\lib\Elmah.dll не представляет сборку со строгим именем - person Zian Choy; 27.08.2009
comment
Я думаю, вам нужно использовать al, а не sn, чтобы подписать его, хотя сначала вам нужно будет сгенерировать ключ с помощью sn. Инструкции см. на странице msdn.microsoft.com/en-us/library/xc31ft41. .aspx - person Steven Sudit; 27.08.2009
comment
Эти инструкции говорят о том, как создать подписанную сборку из одного или нескольких модулей и как работать со сборками, которые были помечены для отложенной подписи во время компиляции, но ничего не говорят о том, как подписать уже существующую. сборка, скомпилированная без строгого имени. - person Joel Mueller; 04.09.2009