Posiadam bibliotekę podstawową w języku C++, a aplikacja kliencka jest w języku C#. Istnieje interfejs C++/cli do uzyskiwania dostępu do aplk C++ z C#. Wszystko działa dobrze, dopóki więcej niż jedna domena aplikacji nie wchodzi w grę, tak jak hostowanie NUnit lub WCF, czyli jedna domena aplikacji.Nie można przekazać klucza GCH do domeny AppDomains: rozwiązanie bez delegatów?
Mam przechowywane obiekt zarządzany w gcroot w cli dla oddzwonienia. Czytałem, że jest to podstawowa przyczyna problemu z domeną aplikacji ("Nie można przekazać GCHANLE w obrębie AppDomains"), ponieważ nie mają informacji o domenie aplikacji (http://lambert.geek.nz/2007/05/29/unmanaged-appdomain-callback/). ktoś zasugerował użycie delegatów, ale moja podstawowa warstwa C++ oczekuje wskaźnika obiektu, a nie funkcji (http://www.lenholgate.com/blog/2009/07/error-cannot-pass-a-gchandle-across-appdomains.html). Próbowałem również IntPtr, ale w tym przypadku nie mogę przesłać go do mojego zarządzanego obiektu podczas wywołań zwrotnych.
UPDATE
Pozwól mi rozwinąć mój problem nieco bardziej.
Mam "Odbiornik" klasy w języku C# i jest przekazywany jako parametr wejściowy do jednego z api. Ten obiekt odbiornika jest używany do wywołania zwrotnego. W C++/CLI utworzyłem klasę Native/unmanaged "ObjectBinder", która jest tą samą repliką (ma te same metody) zarządzanej klasy Receiver. Zawiera odniesienie do obiektu zarządzanego odbiornika w gcroot. Kiedy wywołujemy ten api z C#, przychodzi do warstwy CLI, a domeną aplikacji jest "klient exe". przechowujemy parametr "managed receiver object" w ObjectBinder w gcroot i przekazujemy referencyjny obiekt obiektu ObjectBinder do C++. Teraz kod zaplecza (C++ i c) przesyła asyn wywołanie zwrotne (nowy wątek) do warstwy C++, która używa obiektu ObjectBinder do wysłania z powrotem wywołania do CLI. Teraz jesteśmy w warstwie CLI w obiekcie ObjectBinder. ALE domena aplikacji została zmieniona (w przypadku WCF lub NUNIT lub jakiejkolwiek innej usługi, która tworzy własną domenę aplikacji, która nie jest znana w czasie kompilacji). Teraz chcę uzyskać dostęp do zarządzanego obiektu Receiver, który jest przechowywany w gcroot, aby oddzwonić do C#, ale spowodował błąd APP DOMAIN.
Próbowałem również IntPtr i IUnknown * zamiast gcroot z Marszałek :: GetIUnknownForObject i Marszałek :: GetObjectForIUnknown ale uzyskanie tego samego błędu.
Trudno zrozumieć Twoją aktualizację, nie widząc rzeczywistego kodu. Jeśli mam to dobrze, masz * niezarządzany * obiekt A, który przechowuje wskaźnik interfejsu COM do * zarządzanego * obiektu B. A jest dostępny z innej aplikacji, gdzie oddzwania B, czy to prawda? Jeśli tak, ustaw B na podstawie 'MarshalByRefObject' i sprawdź, czy to pomaga. – Noseratio
@Noseratio Masz to dobrze. –
A więc, czy nie uzyskano odpowiedzi na 'B' z' MarshalByRefObject' i dostęp do niego poprzez 'Marshal :: GetIUnknownForObject()'? Czy robisz to w tym samym wątku (pomimo innej aplikacji)? – Noseratio