He utilizado el siguiente controlador AssemblyResolve
y luego he incluido dll
y pdb
de cualquier conjunto. Puede configurar esto como algo que se ejecuta primero en la aplicación antes de que se necesiten dependencias.
private static void SetupEmbeddedAssemblyResolve()
{
// Based on http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
var name = args.Name;
var asmName = new AssemblyName(name);
// Any retargetable assembly should be resolved directly using normal load e.g. System.Core issue:
// http://stackoverflow.com/questions/18793959/filenotfoundexception-when-trying-to-load-autofac-as-an-embedded-assembly
if (name.EndsWith("Retargetable=Yes"))
{
return Assembly.Load(asmName);
}
var executingAssembly = Assembly.GetExecutingAssembly();
var resourceNames = executingAssembly.GetManifestResourceNames();
var resourceToFind = asmName.Name + ".dll";
var resourceName = resourceNames.SingleOrDefault(n => n.Contains(resourceToFind));
if (string.IsNullOrWhiteSpace(resourceName)) { return null; }
var symbolsToFind = asmName.Name + ".pdb";
var symbolsName = resourceNames.SingleOrDefault(n => n.Contains(symbolsToFind));
var assemblyData = LoadResourceBytes(executingAssembly, resourceName);
if (string.IsNullOrWhiteSpace(symbolsName))
{
Trace.WriteLine(string.Format("Loading '{0}' as embedded resource '{1}'", resourceToFind, resourceName));
return Assembly.Load(assemblyData);
}
else
{
var symbolsData = LoadResourceBytes(executingAssembly, symbolsName);
Trace.WriteLine(string.Format("Loading '{0}' as embedded resource '{1}' with symbols '{2}'", resourceToFind, resourceName, symbolsName));
return Assembly.Load(assemblyData, symbolsData);
}
};
}
private static byte[] LoadResourceBytes(Assembly executingAssembly, string resourceName)
{
using (var stream = executingAssembly.GetManifestResourceStream(resourceName))
{
var assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return assemblyData;
}
}
Absolutamente, sin embargo es necesario para mantener los PDBs de cada generación se envía para que eso funcione de forma fiable - la mejor manera de configurar un servidor de símbolos internamente (ver http://msdn.microsoft.com/en-us/library /ms680693(VS.85).aspx) –
¿Puedo hacer un minivolcado de una aplicación en ejecución? Por ejemplo, si obtengo una excepción no controlada en WinForms, mostraré un diálogo de error al usuario con una opción para enviar un informe de errores y ** continuar ** trabajando con la aplicación (a diferencia de la aplicación de terminación). –
Sí, lea el artículo vinculado. –