Potřeboval jsem opravit jeden bug ve starším projektu, dělaném ješte v .NET 2.0. Jedná se o dll knihovnu s COM rozhraním, která je volána z Excelu. V projektu mám už od dob VS2005 nastavenu záložku Debug takto:
- Start external program: C:\Program Files\Microsoft Office\Office12\EXCEL.EXE
- Command line arguments: C:\Projekty\Pragmatik\Pragmatik.xla
Pragmatik.xla je soubor typu “Doplněk aplikace MS Excel” a obsahuje v podstatě jen makro, které zavolá Pragmatik.DLL, vytvoří z ní instanci hlavního objektu aplikace Pragmatik a předá jí odkaz na Excel, aby tato aplikace mohla Excel ovládat. Veškerý další kód Pragmatiku je už v té DLL knihovně a s výše uvedeným nastavením se dal vždy bez problémů debugovat.
Po přechodu na VS2010 jsem však zjistil, že aplikace se v debug modu sice spustí a funguje, ale nezastavuje se na Breakpointech. Nebudu zbytečně popisovat, co vše jsem marně zkusil, nabídnu rovnou vysvětlení a řešení, které jsem našel na Visual Studio Debugger Team Blog.
Ve stručnosti jde o to, že pokud DLL knihovnu psanou v .NET 2.0 nebo 3.5 spouštíme pomocí externího EXE, nepozná VS2010 spávně cílový framework a použije debug engine z .NET 4.0. A ten pak nedebuguje. Řešením je udělat pro spouštěcí exe program extra konfigurační soubor a v něm explicitně určit, jaká verze frameworku se má pro debugování použít.
V mém případě stačilo udělat soubor Excel.exe.config a do něj napsat:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v2.0.50727" />
</startup>
</configuration>
Netýká se to zdaleka jen Excelu, tak se to třeba bude někomu hodit…