2016-04-18 9 views
0

Ich habe eine Anforderung, wo ich meine WPF-Anwendung von Version 4.0 auf 4.6 nicht aktualisieren sollte, weil wir einige Legacy-Steuerelemente von Drittanbietern verwenden führt zur Hölle Nummer des Fehlers, aber ich sollte eine DLL von Version 4.6 in meinem WPF-Projekt verwenden. Bitte schlagen Sie mir einen Workaround vor, um dies zu erreichen.Verwenden von 4.6v dll ohne aktuelles Projekt Zielframework von v4.0 auf v4.6 C#

Ich bin neu in der COM-Programmierung. Ich denke, das obige ist zum Beispiel möglich, wir verwenden Outlook 2016 dlls, etc., die 4.5v in unseren 4.0 Projekten verwenden, indem wir sie als COM-Komponenten zu unseren Projekten hinzufügen. Alles was es benötigt, ist eine Laufzeitversion des Betriebssystems 4.5.

Antwort

0

Sie können .Net 4.6-Assemblies nicht in einem Prozess verwenden, der mit der 4.0-Laufzeit initialisiert wurde. Der Grund ist, dass die Laufzeit für 4.6 dieselbe Laufzeit für 4.0 ist und daher nicht wie 2.0 Assemblys nebeneinander ausgeführt werden kann. Die VM, die im Prozess geladen wird, interpretiert die Methodentabelle der geladenen Typen nicht korrekt, selbst wenn sie als COM-Schnittstellen exportiert werden. Der Grund dafür ist, dass, selbst wenn eine Schicht Runtime/COM/Runtime-Indirection durchlaufen wird, dieselben 4.0 CLR- und Systemassemblies in diesen Prozess geladen werden und die Instanziierung eines Runtime-Typs aus 4.6 assembly die CLR-Methode RuntimeTypeHandle::CreateInstance verursacht interpretiere die Methodentabelle falsch.

Constructor not found

Der einzige Weg, dies tun könnte, ist, wenn Sie die 4.6 Montage in einem anderen Prozess und remoted es gehostet. Dies ist wahrscheinlich, was passiert mit den Outlook-Add-Ins sowieso, sie werden von dllhost.exe oder ähnlichen Shell-Prozess aus dem Outlook-Prozess gehostet.

+0

so, wenn Sie die 4.0 und 4.6 Zielframework Baugruppen verwenden sagen gleiche 4.0 clr, dann können wir dies mit Reflexion erreichen, da beide die gemeinsame Laufzeit haben. –

0

Sie können den Screenshot hier für meinen obigen Kommentar finden. Solange wir 4.6 Runtime in der Maschine haben. wir können sie mithilfe von Reflektion tun:

demo_screenshot