net - llenar combobox c# windows forms
¿Cómo hacer que mi dll se pueda cargar solo desde la base de código? (2)
Como resultado, todavía no tengo respuesta para la pregunta exacta. Pero el problema está resuelto (gracias a HansPassant) mediante el uso de GAC, ya que los ensamblajes en GAC nunca se copiarán en la sombra (en realidad, el enlazador siempre probará primero los ensamblados en GAC y luego en otros lugares).
La posible respuesta a la pregunta es ir a currentDomain.AssemblyResolve, pero no pude aplicar esta solución a dll que solo contiene interfaces públicas (tipos). Tal vez sea la solución adecuada para algunos casos.
Mi proyecto (algún tipo de motor de procesamiento) está separado en 2 dlls: uno con declaraciones de interfaz y otro con funcionalidad. Por lo general, el proyecto es utilizado por un proyecto Delphi externo a través de la tecnología COM.
Digamos que mi programa corta frutas. El programa delphi externo crea el objeto Fruit y rellena sus propiedades: weight (int), Name (string) y ProgressUpdater (del tipo IProgressUpdater que se declara en el segundo dll con interfaces). Después de este exst programm creater Slicer, crea Slicer.AddFruit (newFruit) y llama a Slicer.Slice ().
Nada especial. En la vida real, el proyecto delphi es Outlook addin. Pero este es el problema: a veces algunos complementos de VSTO hacen que Outlook funcione en el modo "archivos de instantáneas", por lo que cuando el proyecto delphi se inicia y crea el objeto Slicer, nuestro ensamblado c # se colocará en una carpeta temporal y se creará el ensamblado con esta ruta local. Bueno ... esto todavía no es un problema. Pero el problema es cuando el proyecto Delphi crea newFruit y luego pasa el objeto ProgressUpdater, en mi ensamblador Slicer no puedo obtener ProgressUpdater externo: "El argumento Return tiene un tipo inválido", pero aún puede obtener el campo con tipos simples (Weight, Name).
Solo ocurre cuando el modo shadowCopyFiles está activado. Así que mi conjetura es que el ensamblaje externo de ProgressUpdater y el ensamblaje Slicer se colocan en diferentes lugares, por lo que no se pueden pasar. ¿Mi pregunta es cómo evitar que mi dll sea "copiado en la sombra"? ¿O hay alguna solución diferente?
Puede usar reflection para cargar DLL dinámicamente desde cualquier ubicación que desee. Si puede ir de esta manera, puedo proporcionar más código para cargar archivos DLL.