发布后C#程序未运行(.dll问题?)

时间:2019-02-26 09:43:33

标签: c#

使用avicap32.dll进行Webcam Capture的我的程序在我的Windows 10开发计算机上运行没有问题,但是当我想在另一台计算机(Windows 7,未激活更新,离线)上使用发布的版本时,该程序运行,但是一旦我尝试从相机捕获图片,它就无法工作。我抛出一个异常,仅此而已。 (另外,我从网络摄像头中得到了黑色图像,我再次检查了网络摄像头是否已连接并且可以访问)。

要添加avicap32.dll,我使用了以下代码:

//This call is one of the most important and is vital to the operation of the OS.
[DllImport("user32", EntryPoint = "SendMessage")]
public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);

//This API creates the webcam instance so we can access it.
[DllImport("avicap32.dll", EntryPoint = "capCreateCaptureWindowA")]
public static extern int capCreateCaptureWindowA(string lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, int hwndParent, int nID);

//This API opens the clipboard so we can fetch webcam data.
[DllImport("user32", EntryPoint = "OpenClipboard")]
public static extern int OpenClipboard(int hWnd);

//This API cleans the clipboard.
[DllImport("user32", EntryPoint = "EmptyClipboard")]
public static extern int EmptyClipboard();

//This API closes the clipboard after use.
[DllImport("user32", EntryPoint = "CloseClipboard")]
public static extern int CloseClipboard();

//This API retrieves the data from the clipboard for use.
[DllImport("user32.dll")]
extern static IntPtr GetClipboardData(uint uFormat);

//This API is needed to execute the picture indication
[DllImport("cvextern.dll")]
extern static int MyFunction()

这是捕获图像并保存的功能:

public void Capture_Image() {
    try {
        ImageSize();
        m_CapHwnd = capCreateCaptureWindowA("WebCap", 0, 0, 0, m_Width, m_Height, Handle.ToInt32(), 0);
        SendMessage(m_CapHwnd, WM_CAP_CONNECT, 0, 0);
        SendMessage(m_CapHwnd, WM_CAP_GT_FRAME, 0, 0);
        SendMessage(m_CapHwnd, WM_CAP_COPY, 0, 0);
        OpenClipboard(m_CapHwnd);
        CloseClipboard();
        SendMessage(m_CapHwnd, WM_CAP_DISCONNECT, 0, 0);

        Image tempImg = (Bitmap)Clipboard.GetData("Bitmap");
        pictureBox2.Image = tempImg;
        pictureBox2.Refresh();
        GC.Collect();
        GC.WaitForPendingFinalizers();

        fileName = "C:/FHT59N3/Bildanalyse_Projekt/image.jpg";
        Clipboard.GetImage().Save(fileName, ImageFormat.Jpeg);
    }

    catch (NullReferenceException) {
        string message = "No Camera found";
        string title = "Please connect Camera";
        MessageBoxButtons buttons = MessageBoxButtons.OK;
        MessageBox.Show(message, title, buttons, MessageBoxIcon.Warning);
    }
}

我是否需要进行特殊设置以使其在Windows 7上运行?

2 个答案:

答案 0 :(得分:-1)

这本身并不是解决问题的方法,但是太长了,无法放入注释框中。


您可能要考虑删除

GC.Collect(); 
GC.WaitForPendingFinalizers();

因为在可能的情况下使用SafeHandle和/或在处理非托管资源时通常使用the IDisposable pattern总是更好。

GC.WaitForPendingFinalizers();阻止程序执行,直到所有终结器都运行为止,并且它可以引入死锁。 GC.Collect();还会显着降低您的程序速度,因为它会尝试收集所有-与正常的GC运行相反。它也有很高的过载,因为它需要停止所有线程(=阻止程序执行)并遍历所有对象图以查找可以收集的内存。现在无法收集的每个对象都将被提升到下一代,这意味着您的程序将挂在不再实际需要的内存上。


有关更多信息,请参见GC.Collect()的“备注”部分以及GC.WaitForPendingFinalizers的“备注”部分。

另请参见When to call GC.Collect-规则编号1为“请勿”。

答案 1 :(得分:-1)

好的,我有解决办法。我将读取过程从使用外部Dll更改为使用OpenCV命令。工作良好。甚至更少的代码行。

现在这是我阅读网络摄像头的代码:

@IBAction func smsarrivalnotification(_ sender: UIButton) {

        if (sender.isSelected) == true
        {
            smsarivalimg.image = UIImage(named: "Checked-1")
            smsarivallbl.textColor = UIColor.disselectedcolor
            sender.isSelected = false

        }else{
            smsarivalimg.image = UIImage(named: "CheckedSelect")
            smsarivallbl.textColor = UIColor.selectedcolor
            sender.isSelected = true


        }

    }