同一个解决方案下不同exe文件间如何共享变量

连翩西北驰 2011-04-14 11:20:55
现在有一个项目,是在一个解决方案里面有一个主项目,用来登录,校验。功能模块被做成独立的项目,生成exe文件,然后主项目的主界面通过调用功能模块exe文件实现功能。现在在程序运行时想让不同exe文件能共享一个变量值,如何进行?暂时不考虑通过数据库来共享,主要做屏保功能时有用,屏保功能放在主程序中,但是当主程序调用功能模块exe文件时,主程序的Application.AddMessageFilter()方法不会捕捉系统消息,需要在调用的模块中也加入Application.AddMessageFilter()方法。这就存在一个共用变量的问题
...全文
315 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
棋圣 2011-04-15
  • 打赏
  • 举报
回复
做一个公共类,可以使用静态变量,然后2个EXE都引用,这样一个不关闭,另外一个EXE就可以直接使用的啊。
ycproc 2011-04-15
  • 打赏
  • 举报
回复
写socket吧
vrhero 2011-04-15
  • 打赏
  • 举报
回复
进程间通信方法多的很...最简单的如管道、TCP、信号量、文件等,.NET 4.0还支持内存映射文件...

ps:.NET用Win32 API是不明智的...
ttiimm11 2011-04-15
  • 打赏
  • 举报
回复
共用相同的配置文件或ini文件。
我想不明白的是为什么要做成exe,把模块做成dll不行吗,直接调dll的run()函数(当然是你自己的写的) 。
viki117 2011-04-15
  • 打赏
  • 举报
回复

//内存共享类
internal class Win32Mess
{
/*
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, IntPtr lParam);

[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr CreateFileMapping(int hFile, IntPtr lpAttributes, uint flProtect, uint dwMaxSizeHi, uint dwMaxSizeLow, string lpName);

[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr OpenFileMapping(int dwDesiredAccess,[MarshalAs(UnmanagedType.Bool)] bool bInheritHandle,string lpName);

[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr MapViewOfFile(IntPtr hFileMapping,uint dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow,uint dwNumberOfBytesToMap);

[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool UnmapViewOfFile(IntPtr pvBaseAddress);

[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool CloseHandle(IntPtr handle);

[DllImport("kernel32", EntryPoint="GetLastError")]
public static extern int GetLastError ();

const int ERROR_ALREADY_EXISTS = 183;

const int FILE_MAP_COPY = 0x0001;
const int FILE_MAP_WRITE = 0x0002;
const int FILE_MAP_READ = 0x0004;
const int FILE_MAP_ALL_ACCESS = 0x0002 | 0x0004;

const int PAGE_READONLY = 0x02;
const int PAGE_READWRITE = 0x04;
const int PAGE_WRITECOPY = 0x08;
const int PAGE_EXECUTE = 0x10;
const int PAGE_EXECUTE_READ = 0x20;
const int PAGE_EXECUTE_READWRITE = 0x40;

const int SEC_COMMIT = 0x8000000;
const int SEC_IMAGE = 0x1000000;
const int SEC_NOCACHE = 0x10000000;
const int SEC_RESERVE = 0x4000000;

const int INVALID_HANDLE_VALUE = -1;

IntPtr m_hSharedMemoryFile = IntPtr.Zero;
IntPtr m_pwData = IntPtr.Zero;
bool m_bAlreadyExist = false;
bool m_bInit = false;
long m_MemSize=0;

public Win32Mess()
{
}
~Win32Mess()
{
Close();
}

///
/// 初始化共享内存
///
/// 共享内存名称
/// 共享内存大小
///
public int Init(string strName, long lngSize)
{
if (lngSize <= 0 || lngSize > 0x00800000) lngSize = 0x00800000;
m_MemSize = lngSize;
if (strName.Length > 0)
{
//创建内存共享体(INVALID_HANDLE_VALUE)
m_hSharedMemoryFile = CreateFileMapping(INVALID_HANDLE_VALUE, IntPtr.Zero, (uint)PAGE_READWRITE, 0, (uint)lngSize, strName);
if (m_hSharedMemoryFile == IntPtr.Zero)
{
m_bAlreadyExist = false;
m_bInit = false;
return 2; //创建共享体失败
}
else
{
if (GetLastError() == ERROR_ALREADY_EXISTS) //已经创建
{
m_bAlreadyExist = true;
}
else //新创建
{
m_bAlreadyExist = false;
}
}
//---------------------------------------
//创建内存映射
m_pwData = MapViewOfFile(m_hSharedMemoryFile, FILE_MAP_WRITE, 0, 0, (uint)lngSize);
if (m_pwData == IntPtr.Zero)
{
m_bInit = false;
CloseHandle(m_hSharedMemoryFile);
return 3; //创建内存映射失败
}
else
{
m_bInit = true;
if (m_bAlreadyExist == false)
{
//初始化
}
}
//----------------------------------------
}
else
{
return 1; //参数错误
}

return 0; //创建成功
}
///
/// 关闭共享内存
///
public void Close()
{
if (m_bInit)
{
UnmapViewOfFile(m_pwData);
CloseHandle(m_hSharedMemoryFile);
}
}

///
/// 读数据
///
/// 数据
/// 起始地址
/// 个数
///
public int Read(ref byte[] bytData, int lngAddr, int lngSize)
{
if (lngAddr + lngSize > m_MemSize) return 2; //超出数据区
if (m_bInit)
{
Marshal.Copy(m_pwData, bytData, lngAddr, lngSize);
}
else
{
return 1; //共享内存未初始化
}
return 0; //读成功
}

///
/// 写数据
///
/// 数据
/// 起始地址
/// 个数
///
public int Write(byte[] bytData, int lngAddr, int lngSize)
{
if (lngAddr + lngSize > m_MemSize) return 2; //超出数据区
if (m_bInit)
{
Marshal.Copy(bytData, lngAddr, m_pwData, lngSize);
}
else
{
return 1; //共享内存未初始化
}
return 0; //写成功
}
*/
}


SendMessage就不发了,满世界都是,一搜索一大把
viki117 2011-04-15
  • 打赏
  • 举报
回复
SendMessage API了,或者开一个共享内存
  • 打赏
  • 举报
回复
应该有不止一个解决方案。使用自定义的windows消息进行通讯应该可以吧,另外,似乎也可使用memory mapped file来通信,.net framework 4.0里完善了对它的支持和封装,用起来比较方便。
MOTA 2011-04-15
  • 打赏
  • 举报
回复
序列化到本地
然后其他的来读
连翩西北驰 2011-04-15
  • 打赏
  • 举报
回复 1
变量声明问为static,访问权限声明为internal这个是不行的,每个exe文件会独立的引用dll文件,所以他们加载变量的时候也是独立加载类,即使类名相同,其实是不同的类,所以声明为static也不行,每个exe文件会独自操作各自类的static变量
  • 打赏
  • 举报
回复
7楼的代码在.net 4.0下可以大大简化,因为framework已经封装了mmf
连翩西北驰 2011-04-15
  • 打赏
  • 举报
回复
准备结贴,谢谢大家,已解决,采用共享内存的方法,思路如下:http://topic.csdn.net/u/20100728/11/56d8c1ad-553c-4e0d-b005-5b00607a5aac.html
连翩西北驰 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 viki117 的回复:]
C# code

//内存共享类
internal class Win32Mess
{
/*
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, in……
[/Quote]

这个类如何操作,要创建一个对象么,为什么不是用静态方法
w_f_y4422 2011-04-15
  • 打赏
  • 举报
回复
可以考虑操作XML,不用数据库的话。
jason成都 2011-04-14
  • 打赏
  • 举报
回复
这个是不同的程序集,变量声明问为static,访问权限声明为internal试试。
matrixcl 2011-04-14
  • 打赏
  • 举报
回复
这属于进程间通信了。
在c#上还没弄过这方面,帮不了你。

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧