我正在尝试使用LabView,试验如何将它与.NET结合使用.我设法创建了一个小应用程序,它读取一个仪表,转换.NET中的值,并在另一个仪表上显示结果.
麻烦的是,当我尝试添加到.NET项目并重建时,DLL被锁定,我无法覆盖它. NI claims that LabView uses Shadow Copying.但如果这是真的,我的DLL不应该被锁定.
解决方法
我认为您的申请中发生的事情如下:
当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.