La respuesta de JaredPar es buena, excepto que no tiene en cuenta la razón de ser de AppDomains, que es que solo puede DESCARGAR un ensamblado descargando su AppDomain. Si tiene un proceso de sistema operativo de larga duración y espera tener que cargar y luego descargar ensamblados por cualquier motivo, entonces necesita un AppDomain. El ejemplo prototípico aquí es ASP.NET, que carga ensamblajes de código de aplicación a pedido y luego puede descargarlos más tarde, cuando las aplicaciones ya no se utilizan activamente.
El costo que paga por la capacidad de descargar es esa independencia: necesita comunicarse a través del límite de AppDomain. No se puede realizar una simple llamada a un método. Necesita administrar el ciclo de vida de AppDomain. Etc.
Si solo necesita cargar ensamblados dinámicamente y no cree que deba descargarlos durante la vida de un solo proceso, entonces probablemente no necesite ejecutar múltiples AppDomains. Un buen ejemplo aquí podría ser una aplicación enriquecida que admita un modelo de complemento, donde rastrea los ensamblajes de complementos en un directorio "etc" y los carga todos. Sin embargo, si el modelo de complementos requiere descargar los complementos ... bueno.
Hay escenarios atípicos. Supongamos que desea cargar 2 versiones diferentes de un ensamblado al mismo tiempo. Puede encontrarse con dificultades si no los separa con AppDomains. Pero eso será bastante raro.
El escenario central que justifica la existencia de AppDomains es el proceso de larga ejecución que debe poder descargar ensamblados.
Por supuesto, las aplicaciones pueden confiar en el proceso del sistema operativo cuando desee descargar un ensamblaje. En otras palabras, podría tener 3 o 4 procesos cooperativos en ejecución, cada uno con su propio conjunto de ensamblados, y cuando desee descargar un ensamblado, simplemente cierre el proceso que aloja ese ensamblado. Pero AppDomain ofrece un mecanismo de mayor rendimiento para hacer eso, sin requerir la detención / inicio del proceso o las comunicaciones entre procesos, que es aún más pesado que las comunicaciones entre AppDomain descritas anteriormente. Quiero decir, todavía es remoto, pero es más lento y cambia de contexto.