2012-08-28 23 views
5

我正在开发一个DotNet项目,其中包括一个DLL。该DLL使用.lib(C代码)。不幸的是,这个.lib中有很多静态变量。我在这里遇到的问题:DotNet:DLL中的静态变量

如果两个用户同时执行搜索,则会出现错误,因为他们都访问.lib,而其他人尝试读取数据时会发生变化。

显而易见的解决方案是锁定访问权限,但我真的不想这样做,因为这会大大降低搜索速度。我宁愿尝试从lib中创建一个DLL,但我不知道这是否可以解决问题,因为我不知道静态变量是否将单独存储,或者如果两个搜索进程都将访问相同变量。

有没有人有这方面的经验?因为这样做需要相当长的时间,并且我想知道在我开始执行此操作之前它是否有效。

我希望一切都可以理解,因为英语不是我的第一语言,而且我的编程技巧很基础。

+0

您*应*避免过多使用* static *字段。尝试改变*类型*设计。 – adatapost

+1

问题是,C代码充满了静态,改变一切将花费太长的时间。我看到的唯一快速替代方法是尝试使用这个DLL“技巧”。 – Stefan

+0

@Stefan:在一个新的程序集中定义一个新类型,该程序可以访问该C代码(并且只有它),换句话说就是一个包装器。从这种类型的Adn中,按照您想要的方式管理对C资源的独占访问。所以,如果你想调用一些C函数,你必须使用这种类型,如果你将在执行中调用一些东西,相同的类型将阻止你,引发异常,显示消息..不管。 – Tigran

回答

1

从我所了解的情况来看,当您使用这个.dll中的现有类读取数据时,您无法模拟编辑数据。显然这不会起作用,无论你做什么花哨的东西。

你可以做的是创建一个Thunking Layer。这将是一种类型的包装类,将被调用而不是.dll。该类将通过持有读取数据的本地副本来处理并发I/O请求,并允许对真实数据进行无害编辑,并在这些操作完成时更新本地副本(通过适当的临时锁定等)。可能还有其他标准的做法,我不知道,但这是我将如何开始。

我希望这会有所帮助。

+0

这个想法是,每个用户都会有自己的DLL版本运行。现在的问题是,我不知道在DotNet中,静态变量是否会在用户之间共享,或者不是。但是,感谢您的链接,我会研究它,听起来很有趣! – Stefan

+1

@ .NET Framework中的@Stefan静态变量由该变量所包含的所有应用程序用户共享。如果您将额外添加一层来公开这些数据,这可能会有帮助,但我不确定。 – harry180