2012-04-12 8 views
1

Wir haben eine C++ Clr-Anwendung, die wir in eine DLL kompiliert haben. Wir haben mehrere Methoden über eine verwaltete öffentliche ref-Klasse im C++ - Code bereitgestellt. Wir konnten tatsächlich unsere native C# -Anwendung diese dll laden und eine system :: drawing :: bitmap als Referenz übergeben. Alles, was wir tun mussten, war einen Verweis auf die DLL hinzufügen und alle Methoden wurden wegen impliziten Pinvoke ausgesetzt. Sobald wir jedoch versuchen, die DLL in unserer Silverlight-Anwendung zu laden, explodieren die Dinge. Offensichtlich sind die verwendeten C++ clr .net-Bibliotheken nicht mit denen von silverlight kompatibel. Wir haben viele Dinge ausprobiert, aber können einfach nicht silverlight unsere dll anrufen.Aufruf von C++ Clr Dll in C# Silverlight

Bitte, hat jemand irgendwelche Vorschläge, wie Sie das beheben können? Alles wäre zu erfahren!

Vielen Dank!

+0

Welche Art von Fehlern sehen Sie? Ich gehe davon aus, dass "Dinge explodieren", dass es nicht lautlos versagt. ? – DaveE

+0

Silverlight selbst ist nicht mit den üblichen .NET Assemblies kompatibel, aber die serverseitige App funktioniert. Müssen Sie Ihre verwaltete C++ - Assembly wirklich vom Client aus referenzieren oder habe ich etwas falsch verstanden? – dvvrd

+0

Wenn wir einen Verweis auf die DLL in meiner Silverlight-Anwendung hinzufügen, erhalten wir keine Methoden ausgesetzt. Nachdem meine Teamkollegen eine Assembly-Level-Konvertierung der DLL durchgeführt haben, um stattdessen Silverlight-Bibliotheken zu verwenden, haben wir exponierte Funktionen gesehen, aber beim Aufruf einer der exportierten Funktionen haben wir eine Art Laufzeitausnahme bekommen. – Amil

Antwort

2

Sie haben drei Möglichkeiten ich denken kann:

    die Logik in dem C Rewrite
  1. ++/CLR-DLL in einem Silverlight-DLL. Ab Silverlight 5 können Sie P/Invoke verwenden.
  2. Erstellen Sie einen Webdienst, der Ihre C++/CLR-DLL aufruft. Die Silverlight-App kann einen Webdienst aufrufen, und der Webdienst kann die C++/CLR-DLL verwenden.
  3. Setzen Sie Ihre C++/CLR-DLL als COM-Objekt frei, installieren und registrieren Sie sie auf dem Clientcomputer und verwenden Sie die COM support in Silverligh t, um die C++/CLR-DLL zu laden.
+0

Danke! Wir werden das heute versuchen und Sie wissen lassen, ob es funktioniert. – Amil

+0

Wir haben tatsächlich die C++/CLR-DLL als native C++ - DLL kompiliert, indem Sie eine .def-Datei zum Exportieren nativer Funktionen verwendet haben. Wir müssen jedoch mehr Tests durchführen, um zu sehen, ob dies funktioniert. Die größte Herausforderung besteht nun darin, Speicher zu teilen (nämlich, dass die DLL ein von SilverLight gespeichertes Bild verarbeiten soll). Ich plane, Marshal.AllocHGlobal() zu verwenden, das hoffentlich mit SilverLight arbeiten wird. ** Ich werde mehr Details veröffentlichen, wenn wir das funktionieren. Bitte lassen Sie mich wissen, wenn Sie einen Einblick in die Erinnerung haben. ** – Amil

+0

Es hat funktioniert! Wir mussten nicht einmal allochglobal() verwenden. Wir konnten die Adresse des Pixelpuffers in SilverLight direkt übergeben und C++ konnte auf diesen Speicherort zugreifen. – Amil