高手赐教 , c# 如何实现 dll 全局变量.

chinabxm 2006-09-04 04:39:25
我 在一个编译为 dll 类里面,定义一个 静态变量数组, 改数组在 其 调用dll的主程序中是唯一的,但是,主程序中还使用另一个dll,第2个dll也需要访问 第一个dll里已经被主程序初始化了的静态数组的数据. 再 c++中看到可以用共享全局变量
#pragma data_seg("Shared")
int g_Share = 0;
#pragma data_seg()

#pragma comment(linker, "/Section:Shared,rws")
的方法实现.

再这里向各位高手求教,如何再c#中实现.
...全文
630 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
bbbbbb888888 2006-12-20
  • 打赏
  • 举报
回复
高深啊,等看
chinabxm 2006-09-15
  • 打赏
  • 举报
回复
再顶...
chinabxm 2006-09-13
  • 打赏
  • 举报
回复
没人知道吗? 自己顶...
chinabxm 2006-09-12
  • 打赏
  • 举报
回复
yurow 还是那个问题. 单件的实例在不同进程中是不能互相访问的.
yurow 2006-09-11
  • 打赏
  • 举报
回复
你把全局做成个单件,如果第一次访问则实例化,后面的访问都访问第一次的实例就可以了

pubic class Example
{
int pid;

public int ID {
get {return pid;}
set {pid = value}
}

static Example instance=null;
private Example()
{}

public static Example Instance
{
get
{
if (instance==null)
{
instance = new Example();
}
return instance;
}
}
}


访问的时候,直接用Example.Instance.ID 就能访问到Example类实例的属性ID,而且这个实例是唯一的。
chinabxm 2006-09-09
  • 打赏
  • 举报
回复
再次感谢啊,好像问题没有怎么简单.
我做过一个试验.如下:

lib:
using System;
using System.Collections.Generic;
using System.Text;

namespace songtonlib
{
public class lib
{
private static lib instance;
public string a;
public string b;

public static lib Instance
{
get
{
if (instance == null)
{
instance = new lib();
}
return instance;
}
}
}
}

app1:
using System;
using System.Collections.Generic;
using System.Text;
using songtonlib;

namespace songtontest
{
class Program
{
static void Main(string[] args)
{
lib a = lib.Instance;
a.a = "aaa";
Console.WriteLine(a.a);
Console.ReadKey();
}
}
}

app2:
using System;
using System.Collections.Generic;
using System.Text;
using songtonlib;

namespace songtontest
{
class Program
{
static void Main(string[] args)
{
lib a = lib.Instance;
//a.a = "aaa";
Console.WriteLine(a.a);
Console.ReadKey();
}
}
}

分别运行 app1,app2, 在app2中 a.a是没有被赋值的,也就是说, app2 实例化了一个新的lib对象.而没有共享app1实例化的对象.
  • 打赏
  • 举报
回复
static public int g_Share; --> static private int g_Share;

另外你可以给 int Share加上 set{}。


不论什么模式,即使客户端激活,只要服务端进程没有重新启动,通过Share返回的的都是“全局”的。
  • 打赏
  • 举报
回复
进程通讯,根本不是什么dll通讯概念。第一个进程、服务于其它客户端进程的关系。如果说成是一个dll与另外一个dll之间的关系,就乱了。
  • 打赏
  • 举报
回复
既然你是跨进程访问,用“dll全局变量”、“第一个dll、第二个dll”这种毫不上路的名词不是混淆视听嘛。估计是背诵时髦的名词有点走火入魔了,把混乱的东西变成简洁清晰的,这才叫做学懂了。

第2个dll虽然不需要引用第1个dll,访问其中的类型的static也是可以的,只不过你要通过其类型的实例上的属性(get{})来做一个过渡。例如:

public class Shared: MarshalByRefObject{
static public int g_Share;

public int Share{
get{
return g_Share;
}
}
}
}
chinabxm 2006-09-08
  • 打赏
  • 举报
回复
谢谢sp1234的热心帮助啊. 你那个好像解决不了我现在的问题.
chinabxm 2006-09-08
  • 打赏
  • 举报
回复
可能我这个有点复杂.. 是这样子的.

我用的是 remoting ,dll 数据管理类,管理着一个内存数据表. remoting 的宿主程序 需要实例化一个 dll中的数据管理类,而且维护改数据表. 而 remoting 远程类 由 remoting 宿主程序启动(启动后,不跟宿主程序是同一应用程序域),而且也要访问由宿主程序实例化并填充数据的数据管理类. 如果分别引用实例化 songton 模式的类,因为存在2个进程当中,其实还是被实例化了2个类. 所以想向各位高手求教,如何 在2个进程中 访问一个 实例化类中的唯一的数据.
  • 打赏
  • 举报
回复
public class Shared{
static public int g_Share;
}

上面少了 static,关键的东西丢了。sorry!
  • 打赏
  • 举报
回复
你随便编写一个类,例如:

public class Shared{
public int g_Share;
}

那么凡是引用这个项目或者其dll(包括临时动态装入其Assembly)的都可以共用这个g_Share。
chinabxm 2006-09-08
  • 打赏
  • 举报
回复
我查了查资料,你说的单件模式就是 sington 啊,那个对于在dll中,由不同进程进行调用的方法是行不同的. 我早试过了.谢谢.
  • 打赏
  • 举报
回复
Q: 第2个dll也需要访问 第一个dll里.....
————————————————————————————————————————
A: 既然第2个工程已经引用了第1个,那么就直接访问第1个中的那个静态数组,跟第1个工程中自己访问没有任何区别(只要类型允许外部工程可见,例如设置为public)。
chinabxm 2006-09-08
  • 打赏
  • 举报
回复
什么是单件模式啊,能说说详细点吗,谢谢.
yurow 2006-09-05
  • 打赏
  • 举报
回复
用单件模式就可以了
chinabxm 2006-09-05
  • 打赏
  • 举报
回复
自己顶.高手帮帮啊.

110,535

社区成员

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

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

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