Problem (vereinfacht die Dinge klarer zu machen):Statische Bibliotheken mit verwalteten Code Ausgabe
-
1. es gibt eine statisch gelinkte static.lib, die eine Funktion hat, die erhöht:
extern int CallCount = 0;
int TheFunction()
{
void *p = &CallCount;
printf("Function called");
return CallCount++;
}
2. statisch. lib in einer verwalteten C++/CLI managed.dll verbunden, die TheFunction Verfahren wickelt:
int Managed::CallLibFunc()
{
return TheFunction();
}
3. Test app hat einen Referenz mehrere Domänen managed.dll und erzeugt die C++/CLI Wrapper nennen:
static void Main(string[] args)
{
Managed c1 = new Managed();
int val1 = c1.CallLibFunc();
// value is zero
AppDomain ad = AppDomain.CreateDomain("NewDomain");
Managed c = ad.CreateInstanceAndUnwrap(a.FullName, typeof(Managed).FullName) as Managed;
int val2 = c.CallLibFunc();
// value is one
}
Frage:
Nach dem, was ich in grundlegenden .NET Vol1 Die CLR von Don Box gelesen haben, würde ich erwarten, val2 Null, da eine brandneue Kopie von managed.dll sein/static.lib wird geladen wenn CreateInstanceAndUnwrap aufgerufen wird. Verkenne ich, was passiert? Die statische Bibliothek scheint die App-Domänengrenzen nicht zu respektieren, da es sich um nicht verwalteten Code handelt. Gibt es eine Möglichkeit, dieses Problem zu umgehen, indem Sie einen neuen Prozess für die Instanziierung von Managed erstellen?
Vielen Dank an alle!
Wir haben das gleiche hier vor ein paar Jahren mit den gleichen Ergebnissen versucht. Wir erhalten immer nur eine Instanz des nicht verwalteten Codes. –