Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何让LabView停止锁定.NET DLL?_C#_.net_Labview - Fatal编程技术网

C# 如何让LabView停止锁定.NET DLL?

C# 如何让LabView停止锁定.NET DLL?,c#,.net,labview,C#,.net,Labview,我正在试用LabView,尝试如何将其与.NET结合使用。我已经成功地创建了一个小应用程序,它可以读取仪表,在.NET中转换数值,并在另一个仪表上显示结果 问题是,当我尝试添加到.NET项目并重建时,DLL被锁定,我无法覆盖它。但如果这是真的,我的DLL不应该被锁定 有没有办法让LabView停止锁定DLL?除了每次我想要重建时退出LabView之外,这似乎是一个乏味的修复。这里的术语有点不清楚,因为它是指LV“调用”程序集,我不知道这是指在编辑时访问程序集还是在运行时实际调用它。如果是第二个,

我正在试用LabView,尝试如何将其与.NET结合使用。我已经成功地创建了一个小应用程序,它可以读取仪表,在.NET中转换数值,并在另一个仪表上显示结果

问题是,当我尝试添加到.NET项目并重建时,DLL被锁定,我无法覆盖它。但如果这是真的,我的DLL不应该被锁定


有没有办法让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的分布方式而变化。