2010-12-16 4 views
0

Почему следующий код вызывает следующую ошибку?Анонимный метод выдает исключение во время выполнения при доступе к локальной переменной

private static void CreateNewAppDomain() { 
    var cd = AppDomain.CreateDomain("CustomDomain1"); 
    cd.DomainUnload += (sender, args) => Console.WriteLine("Domain 0 unloading,  sender{0}, args{1} domain {2}", sender, args,cd); 
} 



System.Runtime.Serialization.SerializationException was unhandled Message=Type 'CoreConstructs.AppDomainPlay+<>c__DisplayClass3' in assembly 'CoreConstructs, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2642f93804f4bbd8' is not marked as serializable. Source=mscorlib 
    StackTrace: 
     at System.AppDomain.add_ProcessExit(EventHandler value) 
     at CoreConstructs.AppDomainPlay.CreateNewAppDomain() in C:\work\sampleCode\exploreCsharp\exploreCSharp\ParameterPassing\AppDomainPlay.cs:line 31 
     at CoreConstructs.AppDomainPlay.ExploreAppDomain() in C:\work\sampleCode\exploreCsharp\exploreCSharp\ParameterPassing\AppDomainPlay.cs:line 19 
     at CoreConstructs.Program.Main(String[] args) in C:\work\sampleCode\exploreCsharp\exploreCSharp\ParameterPassing\Program.cs:line 14 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

ответ

0

Это потому, что вы пытаетесь использовать cd переменную внутри метода DomainUnload и эта переменная определена во внешней области.

+0

Обычно это нормально, не так ли? Действительно ли проблема в том, что объект, хранящийся `cd`, живет в другом AppDomain, чем код, выполняемый обработчиком OnUnload? Это объясняет «SerializationException». – Eric 2010-12-16 15:03:36

3

Компилятор C# генерирует невидимый вспомогательный класс для реализации лямбда. Вы можете увидеть его имя в сообщении об исключении, <>c__DisplayClass3. Поскольку лямбда работает в добавленном appdomain, экземпляр этого вспомогательного класса должен быть сериализован из основного домена в этот appdomain.

Это не сработает, эти вспомогательные классы не имеют атрибута [Serializable]. Вы не можете использовать лямбда здесь, просто используйте синтаксис назначения регулярных событий в статической вспомогательной функции. Например:

 cd.DomainUnload += NewAppDomain_DomainUnload; 
    ... 

    private static void NewAppDomain_DomainUnload(object sender, EventArgs e) { 
     Console.WriteLine("AppDomain {0} unloading", AppDomain.CurrentDomain); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^