首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >P/Invoke和非托管DLL状态

P/Invoke和非托管DLL状态
EN

Stack Overflow用户
提问于 2011-05-17 19:08:34
回答 2查看 713关注 0票数 8

我有一个程序集和一个非托管DLL。我尝试在非托管DLL中使用静态变量,但它似乎在从程序集调用之间无法继续存在。

我想知道非托管DLL中的静态变量是否可以存在于P/Invoke调用之间,可能我在代码中遗漏了一些东西。如果不是,如果不能选择全局静态变量,那么存储此类非托管DLL的状态的最佳方式是什么?

EN

回答 2

Stack Overflow用户

发布于 2012-09-07 10:34:36

.Net运行时通常不会自行卸载pinvoke DLL,因为它无法知道这样做是否安全,比如它们是否包含状态、包含和全局变量,如静态字符串或其他。

在你的问题中不清楚你是指.Net端的static还是非托管端的static / const。如果你的意思是在托管端,那么在调用返回之后,如果它被封送,并且取决于托管端的调用设置,那么它就不一定存在,除非你遵循一些非常具体的规则。如果它只是一个计划编号,那么它并不重要,所以我将假设它是一个字符串或其他更复杂的结构。

例如,如果被调用者是dll中需要ansi字符串的c函数,而您让pinvoke接受C#字符串,则它会将c# unicode字符串封送到asni字符串,并期望get在调用完成后回收该内存,即使该字符串来自C#静态。即使不是这样,任何指向托管内存的指针在调用后都应该被认为是无效的,除非您正在锁定该内存。

Here is some rope to hang yourself :)使用时要小心。这将无限期地锚定托管内存,我不建议这样做。拥有自己的字符串副本的DLL,或者拥有自己副本的托管端,都不是有史以来最严重的编程犯罪。作为一个实际问题,如果它们各自在自己的堆中都有一个,那么速度会快得多,如果它确实打算是静态的。在调用返回之前,C函数需要创建自己的副本。

票数 2
EN

Stack Overflow用户

发布于 2011-06-28 14:47:37

这种状态完全取决于相关的非托管代码,这取决于它如何处理它的静态变量,一旦你调用它,你就无法控制它,并受到相关库规则的约束。

一位评论者建议你可以通过卸载包含它的库来删除它,这并不是在所有情况下都是可行的(你不能卸载主c库),但可能对你有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6029929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档