У меня здесь очень специфическая проблема, которую я не могу видеть, когда в моей практике, я надеюсь, что вы можете мне помочь, чтобы показать, что я делаю неправильно:Обмен данными между приложением C# библиотекой C
Таким образом, Whe есть два C-sharp консольные приложения и одна библиотека, которая имеет разделяемый сегмент памяти и используется для обмена данными (например, бит состояния).
В библиотеке (для простоты я не могу опубликовать полный код, есть немного больше вещей) выглядит следующим образом:
#pragma data_seg("shared")
int hbStatus = 0;
bool hbExit = false;
#pragma data_seg()
#pragma comment(linker, "/SECTION:shared,RWS")
extern "C" __declspec(dllexport) void __stdcall SetHBStatus(int status)
{
hbStatus = status;
}
И подобный int GetHBStatus()
, который возвращает hbStatus
и геттер и сеттер для hbExit
одного
В основном приложении (названный «мастер») импортируется геттер состояния и выхода сеттера, как этот
class Program
{
const string dllimport = @"interchange.dll";
[DllImport(dllimport)]
public static extern int GetHBStatus();
[DllImport(dllimport)]
public static extern void SetHBExit(bool value);
...
В рабовладельческом применения (HB.exe) импортируется SetHBStatus
и GetHBExit
и имеют эту логику:
static void Main(string[] args)
{
Initialize(); //after initialize, SetHBStatus is set to 1 if succeed, otherwise -1
InitializeHeartbeatTimer(); //timer period is set in initialize and thorows an events, which doing main logic, so we may have empty while cycle
while (!GetHBExit()) { }
Console.WriteLine("HB exit status: " + GetHBExit());
Console.ReadLine();
Deinitialize();
hbTimer.Dispose();
и этот статус используется для мастер-приложение, чтобы продолжить:
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("SUCCESS!");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Invoking heartbeat application");
try
{
Process.Start(System.AppDomain.CurrentDomain.BaseDirectory + "\\HB.exe");
}
catch (Exception e)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Failed to invoke HB application. Ending...");
Console.WriteLine("Message: " + e.Message);
break;
}
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("SUCCESS!");
SetHBExit(false); //clearing junk in library, if any
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Waiting for HB app initializes");
while (GetHBStatus() == 0) //waiting for response HB.exe
{ }
if (GetHBStatus() > 0)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("SUCCESS! Heartbeat send and ticking by interval");
}
if (GetHBStatus() < 0)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("HB application fails. Check HB_log.txt for more details. Ending...");
break;
}
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Generating file for.....
...
И если нам нужно сказать HB-приложение для деинициализации и уничтожения себя, мы позвоним от мастера и ЭТОГО звонка, я делаю ТОЛЬКО одно место, и есть проблема (hbStatus
в библиотеке имеет флаг «1», в его Deini
t устанавливается hbStatus
на «0 "), который ожидает хозяина, например:
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Disconnecting heartbeat");
SetHBExit(true);
while (GetHBStatus() > 0) { }
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("HB killed and disconnected");
Console.WriteLine("\nAll disconnected, invoking main menu");
ShowOptions();
И теперь моя проблема: Когда я выполнить мастер-приложение, оно вызывает HB.exe, пусть инициализации, HB возвращает флаг успеха, мастер будет продолжать нормальную работу, но HB внезапно заканчивается Deinit и закрытий сам по себе, как полученный флаг Exit, но флаг NOTHING и NOBODY устанавливает, вызывая соответствующую функцию (и сообщение об отключении и убийстве не показано).
Когда я пытаюсь импортировать SetHBExit в HB.exe и вызывать с ложью после инициализации, проблема все еще появляется.
Это можно увидеть только в 32-разрядных приложениях и библиотеках, если я скомпилирую их на 64-й версии, приложения работают плавно и в случае необходимости. Но я не могу использовать 64-битную версию, потому что приложения для моего клиента, которые не могут запустить его в 64-й версии (это также странная проблема, у него есть W7 в 64 бит, но получает исключение BadImageFormatException, в то время как программа пытается сначала позвонить функция библиотеки (и в моей машине он работает правильно странно, странно.)
Любые предложения, где я неправильно