c# – 如何让LabView停止锁定我的.NET DLL?

前端之家收集整理的这篇文章主要介绍了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.

猜你在找的C#相关文章