0

我这里有一个非常具体的问题,我在实践中从未见过,我希望你能帮助我证明我做错了什么:

因此,如果有两个 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()which 返回hbStatus,以及 getter 和 setter 为hbExit一个

在主应用程序(名为“master”)中导入状态获取器和退出设置器,如下所示

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) 中导入SetHBStatusGetHBExit具有以下逻辑:

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 应用程序取消初始化并杀死自己,我们将从 master 调用,这个调用我只在一个地方进行,并且存在问题(hbStatus在库中有“1”标志,在它的Deinit 中设置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();

现在是我的问题:当我执行一个master应用程序时,它调用HB.exe,让它初始化,HB返回成功标志,master将继续正常工作,但是HB突然在Deinit结束并关闭自己,作为收到退出标志,但是标志 NOTHING 和 NOBODY 通过调用适当的函数设置(并且未显示有关断开连接和终止的消息)。

当我尝试将 SetHBExit 导入 HB.exe 并在初始化后以 false 调用时,问题仍然出现。

这只能在 32 位应用程序和库上看到,如果我将其编译到 64 位版本,应用程序运行顺畅且符合需要。但是,我不能使用 64 位版本,因为应用程序是给我的客户的,他不能在 64 版本中运行它(这也是一个奇怪的问题,他有一个 64 位的 W7,但是在程序尝试第一次调用时收到 BadImageFormatException库函数(在我的机器上它运行正常。奇怪,奇怪)

有什么建议我错了吗?

4

1 回答 1

0

更新和可能的解决方案:

“旧”C 不支持“bool”类型,如果我使用 BOOL,即 typedef int,32 位应用程序可以正常运行。所以我认为这个问题已经解决了:)

64 位机器上的 64 位应用程序的次要问题仍未解决,BadImageFormat 异常,但在我的机器上效果很好

于 2013-02-11T13:17:52.000 回答