c# – 如何让LabView停止锁定我的.NET DLL?
我正在尝试使用LabView,试验如何将它与.NET结合使用.我设法创建了一个小应用程序,它读取一个仪表,转换.NET中的值,并在另一个仪表上显示结果.
麻烦的是,当我尝试添加到.NET项目并重建时,DLL被锁定,我无法覆盖它. NI claims that LabView uses Shadow Copying.但如果这是真的,我的DLL不应该被锁定. 有什么方法可以让LabView停止锁定DLL吗?除了每次我想重建时退出LabView,这似乎是一个乏味的修复. 解决方法
我认为您的申请中发生的事情如下:
当Labview启动时,它会拉入应用程序的dll,将其紧紧锁定在内存中.因此,文件被锁定,Visual Studio将无法覆盖此文件(我已在其他应用程序中直接看到此行为).由于dll在Labview退出之前永远不会被释放,因此每次重新编译时都需要找到一种“欺骗”Labview加载新dll的方法. 这是我的建议: 在LabView中,而不是像Chris Sterling所建议的那样直接加载你的dll,你需要创建一个“包装”dll,它将通过一个接口加载你的特定LabView dll 通过利用存储在您的包装器dll中的接口,您可以完全解耦两个dll,这将阻止包装器dll知道/锁定您的主dll.稍后,当您完成调试后,您可以直接将dll链接到LabView. 以下是代码的外观: public class LabViewWrapper : IYourCustomClass { private IYourCustomClass _labViewClass; private string labviewPath = "Full Path to labview dll"; public LabViewWrapper() { Assembly assembly; try { using (FileStream fs = File.OpenRead(labviewPath)) { using (MemoryStream ms = new MemoryStream()) { byte[] buffer = new byte[1024]; int read = 0; while ((read = fs.Read(buffer,1024)) > 0) ms.Write(buffer,read); assembly = Assembly.Load(ms.ToArray()); ms.Close(); } fs.Close(); } Type t = assembly.GetType(IYourCustomClass); _labViewClass= (IYourCustomClass)Activator.CreateInstance(t); } catch { // Unable to load dll dynamically } } // Implement all the methods in your interface with something like the following: /// <summary> /// Your Custom Method /// </summary> public void CustomLabViewMethod() { _labViewClass.CustomLabViewMethod(); } } 通过这种方式,您从内存加载DLL,因此labview永远不会锁定您编译的原始DLL.唯一真正的缺点是它确实使调试更难,如果你想插入断点,你可能需要直接引用源dll. 注意:有一点我不确定,但我相信会“解决”的问题是Labview是否足够聪明,每次执行代码时都能重新构造对象,或者它是否只是在整个会话期间保持相同的对象.如果它最终执行后续操作,则每次启动自定义窗口小部件时,都需要添加代码以从文件系统“重新加载”dll. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |