Feed
Google+
Contact
XING
LinkedIn
Twitter
ICQ
meebo.com

Die Assembly Irgendwas, Version=4 … kann nicht gefunden werden.

by Roland Schumacher alias GENiALi 8. Oktober 2008 -- 303 words  -- 1953 mal gelesen

Wie oft habe ich nun diese Fehlermeldung schon bekommen. Es ist unglaublich.

Ich portiere zur Zeit ein Office 2003/2007 Add-In, dass mit VSTO entwickelt wurde, nach Office 2002/XP. Dort ist nicht mehr die VSTO aktuell sondern die PIA’s (Primary Interop Assemblies) für Office XP. Im grossen und ganzen wird das Add-In einfach anders geladen. Vor allem darf man mit dem Extensibility.IDTExtensibility2 Interface arbeiten. Den restlichen Code kann man 1 zu 1 übernehmen.

Das Add-In wird im Office als ganz normales COM Add-In registriert und auch als solches behandelt. Genau das verursacht nun diverse Probleme die umschifft werden müssen.

Die .NET Laufzeit sucht in dieser Konstellation die diversen beteiligten Verweise im Ausführungsverzeichnis von der startenden Office-Anwendung. Das ist dann meist im Ordner “C:\Programme\Microsoft Office\Office10”. Dort sind die Assemblies aber nicht vorhanden. Was kann man dagegen tun?

Zum Beispiel hilft diese Datei, die man genau in den besagten Order tut, bei Word schon einiges. Die Datei heisst WINWORD.EXE.config und hat folgenden Inhalt.

<?xml version="1.0"?>
<configuration>
    <startup>
        <supportedRuntime version="v2.0.50727"/>
    </startup>
</configuration>

Das erleichtert einem schon einiges. Die Standard-Assemblies werden so gefunden.

Aber beim BinaryFormatter greift auch das nicht. Hier muss man es anders Lösen.

licenses = (LicenseCollection)formatter.Deserialize(licensestream);

Hier kommt die Meldung, dass die Assembly für den Typ LicenseCollection nicht gefunden werden kann. Das ist dann natürlich sehr ärgerlich.

Hier habe ich dann die Lösung gefunden.

private static void InitializeLicenses()
{
	ResolveEventHandler loadComponentAssembly = new ResolveEventHandler(LoadComponentAssembly);
	AppDomain.CurrentDomain.AssemblyResolve += loadComponentAssembly;

    licenses = new LicenseCollection();

	string licensefilename = 
		Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.
		GetExecutingAssembly().CodeBase), 
		"license.dat").Replace(@"file:\", "");

    if(File.Exists(licensefilename))
    {
		try
		{
			FileStream licensestream = 
				new FileStream(licensefilename, FileMode.Open, FileAccess.Read);
			BinaryFormatter formatter = 
				new BinaryFormatter();

			formatter.AssemblyFormat = 
				System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;

			licenses = (LicenseCollection)formatter.Deserialize(licensestream);
			licensestream.Close();
		}
		catch (Exception ex)
		{}
		finally
		{
			AppDomain.CurrentDomain.AssemblyResolve -= loadComponentAssembly;
		}
    }
    else
    {
        ErrorHandler.LogInfo(1000, "License not found!");
    }
}

static Assembly LoadComponentAssembly(Object sender, ResolveEventArgs args)
{
	string simpleName = args.Name.Substring(0, args.Name.IndexOf(','));
	string assemblyPath = simpleName + ".dll";
	return Assembly.LoadFrom(Path.Combine
				(Path.GetDirectoryName
				(System.Reflection.Assembly.GetExecutingAssembly().CodeBase), 
				assemblyPath).Replace(@"file:\", ""));
}

So wird die Assembly gefunden.

Und wieder ein Problem weniger. Ab zum nächsten. :-)

Tags: , ,

Entwicklung | Software

Kommentar schreiben

  Country flag

biuquote
  • Kommentar
  • Live Vorschau
Loading

Statistik

Gesamte Posts: 1018
Dieses Jahr: 0
Diesen Monat: 0
Diese Woche: 0
Kommentare: 922
Total Bewertungen: 84
Ø Bewertung: 4,37
Meisten Kommentare
Google+ ... (28)
Beste Ø Bewertung
Tryton - Teil 6 - Installation ... (5)
Meiste Bewertungen
Windows 7 und die ersten Erfah ... (5)

Buttons

Benutzerprofil von GENiALi connection speed test network connection Bloggeramt.de Slug.ch Blog Verzeichnis und Blog Webkatalog Schumacher Roland Seitwert Valid XHTML 1.0 Transitional