- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 Silvelight 5 应用程序有一个非常具体的问题:我有动态加载 Silverlight 库(可能很多)的应用程序,这些库通过 dllimport 调用方法。
原因:针对不同扫描设备的应用。 Silverlight 库用于逻辑,C++ 库来自生产者并与设备连接。可能有很多 silverlight 库,它们必须在运行时加载。
问题:加载 Silverlight 库并扫描后 - 我无法使用 C++ 库访问文件。为什么我必须?如果用户尝试选择扫描仪,我会计算库的哈希码以检查服务器上是否有更新的版本。
我的实现:ViewModel 正在调用获取当前扫描器类的方法:
using (var stream = new IsolatedStorageFileStream(scanner.DirectoryName + Path.DirectorySeparatorChar + scanner.ScannerLibraryName, System.IO.FileMode.Open, store))
{
AssemblyPart assemblyPart = new AssemblyPart();
Assembly assembly = assemblyPart.Load(stream);
return (Scanner)assembly.CreateInstance(scanner.ClassName);
}
稍后是扫描:
this.userScanner.LoadProducerLibrary();
result = userScanner.ScanDocument();
this.userScanner.FreeProducerLibrary();
LoadProducerLibrary 调用:
[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern IntPtr LoadLibrary(string lpFileName);
ScanDocument 也通过 dllimport 调用一些第三方方法。
FreeProducerLibray 调用:
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)] /* unnecessary, isn't it? */
public static extern bool FreeLibrary(IntPtr hModule);
在那之后,我在不同的 View 模型中有一个方法试图打开生产者库文件来计算哈希码,但我得到“无法访问该文件,因为它正在被另一个进程使用”。
我尝试在 Scanner 类(动态加载程序集)中计算哈希码,它没问题,所以我怀疑是这个过程。但为什么 FreeLibrary 还不够呢?
你能给我一些建议吗?我应该尝试以某种方式处理 userScanner 字段吗?
最佳答案
ScanDocument calls some third part methods also via dllimport.
您遗漏了最重要的代码,但该陈述足以诊断您的问题。 pinvoke 编码器还调用 DLL 上的 LoadLibrary()。所以 DLL 的引用计数是二。您的 FreeLibrary() 调用不会卸载它并且文件保持锁定状态。
您可以通过再次调用 FreeLibrary() 来解决这个问题。 将 卸载 DLL,但也会在您的程序中放置一颗定时炸弹。您无法安全地再次进行这些调用。 pinvoke 编码器仍然确信 DLL 已加载,因此它不会重新生成它为导入函数生成的 stub 。它们指向函数以前加载的地址,而不是现在加载的地址。它似乎 会起作用,特别是当您在人工测试中这样做时。但迟早,DLL 无法再次在同一地址重新加载,因为它的地址空间已用于其他用途,您的程序将因硬崩溃而失败。
如果你想让这个工作,那么你不能对这些方法使用 [DllImport]。您必须改为执行 pinvoke 编码器所做的工作,并为您使用的每个入口点调用 GetProcAddress(),并使用您声明的与 native 函数签名匹配的委托(delegate)使其可通过 Marshal.GetDelegateForFunctionPointer() 调用。有效,它不漂亮。
更好的选择是使用一个单独的辅助进程来进行这些调用并与之互操作。现在是安全的,让辅助进程终止确保 pinvoke stub 消失并且 DLL 被解锁。不确定 Silverlight 中的实用性,它并不是真正设计为功能列表上的进程互操作。没有 Process 类,这给方法带来了障碍。
关于c# - Silverlight 中动态加载的程序集调用锁定文件的 DllImprot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24339773/
C#内部访问修饰符的定义是内部:只能在包含程序集或友元程序集内访问。所以我的问题是什么是 C# 程序集?在包含程序集或 friend 程序集之内是什么意思?它是否意味着在同一个命名空间或项目中? 最佳
任何人都可以回答以下问题。我正在使用 c# 语言。 我可以将程序集调用为 .ddl 或 .exe 文件吗? 我可以将 Assembly Manifest 称为程序集吗? 程序集、元数据和程序集 lis
我正在从 Python 运行一个 .NET COM 程序集,只有当我将程序集 dll 和依赖项复制到我的 Python 根路径 c:\Python27 时才能使它正常工作。 这是不整洁的,所以我想将
作为世界上任何一名程序员,他/她一生中至少有一次,我正在尝试创建我的“革命性”,新的且唯一的操作系统。 :D 好吧,我正在使用虚拟模拟器(Oracle VM Virtual Box),为此我创建了一个
我创建了以下程序来读取 5 个数字,然后 dumpreg查看输入的数字... INCLUDE Irvine32.inc .data count = 5 scor
如何在保护模式下执行 IN 和 OUT 等受限指令? 我发现它需要足够高的特权级别(CPL)才能执行 IO 指令。我怎样才能在内核模式下运行,拥有 IO 权限或任何其他可能对我有帮助的东西? - 我希
目录 C# 程序集、模块和类型概念及关系 概述 程序集 模块 类型 程序集、模块和类型的关系 总结 引用
构建 maven assembly ,我留下了这样的东西: ${project.basedir} / LICENS
我的应用程序由几个核心程序集和几个扩展/插件程序集组成。为了让 MEF 知道插件必须提供的所有部件,即使我永远不会使用它们的任何部件,我也必须加载这些程序集。这使得应用程序需要更多时间来启动(如果我要
我对我们的构建基础结构有一个非常具体的要求,即将另一个 JAR 依赖项的一些内容复制到我的 Web 应用程序的特定子文件夹中。我们正在使用 maven-assembly-plugin,一个自然的方法是
为什么下面的指令会设置符号标志? mov al,0FEh sub al,2 据我了解,AL寄存器可以保存2^8 - 1或255。0FEh = 254(十进制)。减去 2 叶 252。这似乎是正数。 (
我以前使用过 NUnit,但已经有一段时间了,而且从来没有在这台机器上使用过。我在 Program Files 下解压了 2.4.8 版本,并且在尝试加载测试时不断收到此错误。 Could not l
我说的是一个使用 C# 进行游戏编程的小型游戏引擎。所以,我有一个嵌入单声道运行时的 C++ 应用程序(我称之为“启动器”)。我有一个用 C# 编写的程序集,它是我的游戏引擎类库。启动器按照 Embe
我对汇编相当陌生,并尝试从标准输入读取值(从 C 调用 scanf 函数)并将其打印回标准输出(使用 printf)。 .text readstr: .asciz "%d" #strin
谢谢帮助,我的问题是关于从下面的代码中收到的 ax 值? mov al,22h mov cl,0fdh imul cl 真机结果:ff9a 我的预期:00:9a(通过二进制相乘) 第一个数字是 22h
我正在开发一个汇编程序,该程序将整个文本文件读入缓冲区,然后将其显示在控制台中。它立即显示 24 行(每行的最大长度为 80,因为我使用 80 宽 * 25 高的 dossbox )然后等待用户输入,
我正在使用一个简单的程序集片段,使用 BIOS 作为引导加载程序的一部分将字符打印到屏幕上。这是引导加载程序代码。 [org 0x7c00] [bits 16] %include "a20_check
我只是想知道这段代码是什么意思: XOR EAX,EBX XOR EBX,EAX XOR EAX,EBX 最佳答案 那是 xor swapping . 在寄存器上执行它不会遇到常见的难看的失败案例。
我在新电脑上的 XNA 项目开始出现奇怪的错误。我有两个关于解决方案的项目和一个由它们使用的库。其中一个项目,一个 XNA 游戏项目,运行完美。另一个项目是 WindowsForm 和 XNA 的混合
是的,我正在努力实现类似的目标 __asm__(jmp label;); 其中 label 应替换为内存中保存的字符串值(结构体的字段)。 有没有办法做到这一点(或类似的方法可以让我跳转到运行时确定的
我是一名优秀的程序员,十分优秀!