В настоящее время у меня есть система со следующим упрощенным представлением.
The entire system run under single process
------------------------------------------
--- DLL0.DLL --- COMMON.DLL (contains global_variable in COMMON.DLL)
EXE ---|
--- DLL1.DLL --- COMMON.DLL (contains global_variable in COMMON.DLL)
Исходный код COMMON.DLL выглядит следующим образом.
// COMMON.DLL
#ifdef COMMON_EXPORTS
_declspec( dllexport ) int global_variable = 100;
// Function used to access and print global_variable.
__declspec(dllexport) void common_fun_which_access_global_variable();
#else
_declspec(dllimport) int global_variable;
__declspec(dllimport) void common_fun_which_access_global_variable();
#endif
Исходный коддля DLL0.DLL выглядит следующим образом.
__declspec(dllexport)
void DLL0() {
printf ("This is DLL0\n");
printf ("In DLL0, global_variable is %i\n", global_variable);
common_fun_which_access_global_variable();
global_variable = 200;
printf ("DLL0 is now setting global_variable to 200\n");
common_fun_which_access_global_variable();
}
Исходный код для DLL1.DLL выглядит следующим образом.
__declspec(dllexport)
void DLL1() {
printf ("This is DLL1\n");
printf ("In DLL1, global_variable is %i\n", global_variable);
common_fun_which_access_global_variable();
global_variable = 400;
printf ("DLL1 is now setting global_variable to 400\n");
common_fun_which_access_global_variable();
}
Исходный код для EXE выглядит следующим образом.
HINSTANCE instance0 = AfxLoadLibrary(_T("DLL0.dll"));
FARPROC fun0 = GetProcAddress(instance0, "DLL0");
HINSTANCE instance1 = AfxLoadLibrary(_T("DLL1.dll"));
FARPROC fun1 = GetProcAddress(instance1, "DLL1");
_fun0();
_fun1();
Вывод выглядит следующим образом.
This is DLL0
In DLL0, global_variable is 100
In COMMON, global_varialbe is 100
DLL0 is now setting global_variable to 200
In COMMON, global_varialbe is 200
This is DLL1
In DLL1, global_variable is 200 <-- I wish 100 is being printed.
In COMMON, global_varialbe is 200 <-- I wish 100 is being printed here too.
<-- I wish DLL0 and DLL1 have their own instance of
<-- global_variable respectively.
DLL1 is now setting global_variable to 400
In COMMON, global_varialbe is 400
Вся система выполняется в рамках одного процесса.Хотя DLL0.DLL
и DLL1.DLL
загружаются явно каждая, зависимость COMMON.DLL
будет загружаться только один раз за весь жизненный цикл приложения.EXE не будет загружать один и тот же COMMON.DLL
дважды.
Есть ли способ, которым я могу добиться следующего без нарушения одного из правил?
- DLL0 и DLL1 могут иметь свой собственный экземпляриз
global_variable
? global_variable
должен быть глобальным, а внутреннее COMMON.DLL
? COMMON.DLL
будет загружено через неявное связывание с использованием файла LIB. - Нет переименования
COMMON.DLL
в COMMON-DLL0.DLL
и COMMON-DLL1.DLL
. - Нет статического связывания.
- Если DLL0 изменит значение
global_variable
, вызов common_fun_which_access_global_variable
из DLL0 должен получить доступ кDLL0 изменило значение.Тем не менее, вызов common_fun_which_access_global_variable
из DLL1 не должен реализовывать изменения.
** Я знаю, что это слишком много.Но сейчас я имею дело с устаревшим кодом.Вы знаете:)
Сможет ли параллельная сборка решить эту проблему?Я понимаю, что параллельная сборка используется для решения нескольких DLL с одинаковыми именами, но с разными версиями.Я не уверен, применимо ли это в моем случае выше?
Или я должен спросить об обратном?Как мы можем загрузить 2 экземпляра COMMON.DLL в один и тот же EXE-файл?