2013-02-10 5 views
0

У меня здесь очень специфическая проблема, которую я не могу видеть, когда в моей практике, я надеюсь, что вы можете мне помочь, чтобы показать, что я делаю неправильно:Обмен данными между приложением 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, в то время как программа пытается сначала позвонить функция библиотеки (и в моей машине он работает правильно странно, странно.)

Любые предложения, где я неправильно

ответ

0

Update & Возможное решение:

«Старый» C не поддерживает " bool ", как есть, если я использую BOOL, который является typedef int, выполняется 32-разрядное приложение. Поэтому я рассматриваю эту проблему как решаемую :)

Вторичная проблема с 64-битным приложением на 64-битной машине по-прежнему остается нерешенной, исключение BadImageFormat, но на моей машине это отлично работает

Смежные вопросы