C# 如何让LabView停止锁定.NET DLL?
我正在试用LabView,尝试如何将其与.NET结合使用。我已经成功地创建了一个小应用程序,它可以读取仪表,在.NET中转换数值,并在另一个仪表上显示结果 问题是,当我尝试添加到.NET项目并重建时,DLL被锁定,我无法覆盖它。但如果这是真的,我的DLL不应该被锁定C# 如何让LabView停止锁定.NET DLL?,c#,.net,labview,C#,.net,Labview,我正在试用LabView,尝试如何将其与.NET结合使用。我已经成功地创建了一个小应用程序,它可以读取仪表,在.NET中转换数值,并在另一个仪表上显示结果 问题是,当我尝试添加到.NET项目并重建时,DLL被锁定,我无法覆盖它。但如果这是真的,我的DLL不应该被锁定 有没有办法让LabView停止锁定DLL?除了每次我想要重建时退出LabView之外,这似乎是一个乏味的修复。这里的术语有点不清楚,因为它是指LV“调用”程序集,我不知道这是指在编辑时访问程序集还是在运行时实际调用它。如果是第二个,
有没有办法让LabView停止锁定DLL?除了每次我想要重建时退出LabView之外,这似乎是一个乏味的修复。这里的术语有点不清楚,因为它是指LV“调用”程序集,我不知道这是指在编辑时访问程序集还是在运行时实际调用它。如果是第二个,这可能解释了为什么它被锁定
我不是一个.NET程序员,所以我不知道实际的解决方案是什么,但我猜实际上不需要完全关闭LV来释放锁。有可能关闭项目就足够了,虽然我知道这并不一定更好,如果锁定发生在进程级别,可能也不会有帮助。我正在LV2012中使用一个C#类进行测试,该C#类在Labview VI的单独文件夹中具有一个新的自定义类。我能够在VS2010中重新编译C#代码,而不必关闭Labview,但是Labview看不到对DLL的更改(如果有)。为了让Labview看到测试用例中的更改,需要完全关闭并重新打开它 对于LabVIEW C++ + DLL,您必须关闭调用VIS,因为DLL的引用是开放的。不过,您只需关闭Labview启动窗格 通过进入project->Properties->Debug->Start External Program,可以让VS在C#项目中自动生成Labview.exe。当您在VS中点击F5时,DLL编译并生成Labview。然而,VS不会自动将DLL附加到进程,这真的非常讨厌。不知道这是否有帮助 P>个人喜欢C方法与LabVIEW的集成,但发现C++更强大。与C++一起工作,你也可以用类似的方式生成LabVIEW,但是它自动将DLL连接到LabVIEW.EXE进程,调试一次只需点击F5的进程。您仍然可以使用C++类和类,只需要在LabVIEW中封装C函数调用它们即可。给出了C++的一步调试和功率,在LabVIEW中使用外部代码时,它优于C语言。 当Labview启动时,它会拉入应用程序的dll,将其紧紧锁定在内存中。因此,该文件被锁定,VisualStudio将无法覆盖该文件(我在其他应用程序中直接看到了这种行为)。因为直到Labview退出,dll才会被释放,所以每次重新编译时,您需要找到一种方法“欺骗”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, 0, 1024)) > 0)
ms.Write(buffer, 0, 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();
}
}
公共类LabViewWrapper:IYourCustomClass
{
私有IYourCustomClass(uLabViewClass);
私有字符串labviewPath=“labview dll的完整路径”;
公共LabViewWrapper()
{
装配;
尝试
{
使用(FileStream fs=File.OpenRead(labviewPath))
{
使用(MemoryStream ms=new MemoryStream())
{
字节[]缓冲区=新字节[1024];
int read=0;
而((read=fs.read(buffer,01024))>0)
ms.Write(缓冲区,0,读取);
assembly=assembly.Load(ms.ToArray());
Close女士();
}
fs.Close();
}
类型t=assembly.GetType(IYourCustomClass);
_labViewClass=(IYourCustomClass)Activator.CreateInstance(t);
}
抓住
{
//无法动态加载dll
}
}
//使用以下方法实现界面中的所有方法:
///
///您的自定义方法
///
public void CustomLabViewMethod()
{
_labViewClass.CustomLabViewMethod();
}
}
通过这种方式,您正在从内存加载dll,因此labview从不锁定您编译的原始dll。唯一的缺点是,它确实使调试更加困难,如果要插入断点,可能需要直接引用源dll
注意:有一件事我不确定,但我相信会“解决”的是Labview是否足够聪明,可以在每次执行代码时重新构造对象,或者它是否只是在整个会话中保持相同的对象。如果它最终执行了后面的操作,则每次启动自定义小部件时,您都需要添加代码以“重新加载”文件系统中的dll。您可以创建一个轻型dll包装器,该包装器本身具有显式的主dll运行时加载和卸载功能。这样,包装器将保持锁定状态,但您可以快速更新频繁更改的代码DLL。get
解锁器-h
用于其comand线路选项
在预构建中运行。在相关DLL上使用解锁命令
如果仅解锁没有帮助,请使用解锁+删除
简单到
解锁mydllpath.dll/s/d
您会发现此行为会根据dll的分布方式而变化。