2012-04-23 1 views
6

В течение многих лет я следил за рекомендациями MS по написанию настраиваемого класса исключений (даже не помню, был ли он впервые применен FxCop или прочитанной статьей) и написал мои классы следующим образом:C#, приложение Metro, специальный класс исключений

using System; 
using System.Runtime.Serialization; 

[Serializable] 
public sealed class MyGreatException : Exception 
{ 
    public MyGreatException() 
    : base() {} 

    public MyGreatException(string message) 
    : base(message) {} 

    public MyGreatException(string message, Exception inner) 
    : base(message, inner) {} 

    private MyGreatException(SerializationInfo info, StreamingContext context) 
    : base(info, context) {} 
} 

Сегодня эти классы получают отвергнут Windows 8 App Cert Kit:

.API System.Runtime.Serialization.SerializationInfo in MSCORLIB, PUBLICKEYTOKEN=B77A5C561934E089 is not supported for this application type. com.visionobjects.myscript.hwr.dll calls this API. 
.API System.SerializableAttribute in MSCORLIB, PUBLICKEYTOKEN=B77A5C561934E089 is not supported for this application type. com.visionobjects.myscript.hwr.dll calls this API. 

(среди прочего отвергает ...)

Так что теперь это 2012 , как написать собственный класс исключений? Мне просто нужно удалить [Serializable], а частный конструктор должен иметь дело с пользовательской сериализацией (что мне не нужно в любом случае)?


EDIT

Я удалил [Serializable] и закрытый конструктор. Я предполагаю, что мой собственный класс исключений не является сериализуемым. Как это класс, открытый библиотекой классов, как это влияет на код с помощью библиотеки?

+1

хм, поэтому подписать «спасибо» в вашем вопросе больше не разрешено? :) –

+0

nope, приветствия и другие обычные формы неодобрительно относятся к SO. Лично я не против, но некоторые люди их редактируют. – jv42

ответ

2

Не похоже, что System.Runtime.Serialization.SerializationInfo поддерживается в Metro-совместимой версии .NET framework. См. http://msdn.microsoft.com/en-us/library/windows/apps/hh454059(v=vs.110).aspx для получения информации о том, какие классы они предпочитают поддерживать из пространства имен System.Runtime. Имейте в виду, что это может быть изменено.

Итак, да, возьмите свой атрибут Serialization и частный конструктор.

+1

более важно, выньте свою ссылку на любую из старых библиотек .NET, чтобы вы случайно не использовали одно из многих других вещей, которые больше не разрешены –