c# winform程序发布后运行时出现的一个问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# winform程序发布后运行时出现的一个问题相关的知识,希望对你有一定的参考价值。

情况是这样:程序是的用vs2008+access,使用了水晶报表,开发使用的操作系统为win7。发布生成setup安装文件,在其他win7电脑上安装一切正常,当然在使用用程序的win7系统下安装了CRRedist2008_x86.msi报表支持文件。但是在xp下使用,其他功能好使,只是在使用报表功能时出现了下面的错误提示:
未能加载文件或程序集“CrystalDecisions.Windows.Forms,Version=10.5.3700.0,Culture=neutral,PublicKeyToken=692fbea5521e1304”或它的某一个依赖项。程序找不到指定的文件。。
在使用的xp电脑上曾经安装过CRRedist2008_x86.msi,同时也安装了.ner framework 3.5
请帮忙看看,错误的原因是什么,是否和CRRedist2008_x86有关?

楼主的操作是正确的.使用vs.net打包生成setup应该已经检测并打包了CR的运行库安装包.

至于在XP下用的时候出的问题,应该还是该机器的问题.

可以在一个干净的XP系统下安装再运行,看看是不还有这个问题.
如果还有,可以单独安装CRRedist2008_x86.
参考技术A 应该是你水晶报表的支持文件没有正确安装,
你可以测试一下就知道了,
你在你的xp上写个程序,然后把水晶报表也加到程序里,看看程序运行有没有问题哈!

如果不行的话,你换台其他的xp试试,前提是你要有水晶报表的支持文件哈!

祝你成功哈!
参考技术B 看看是不是访问权限问题呢 参考技术C 差文件要装CRRedist2005_x86.msi,CRREdist2005_x86_chs.msi

C# winform 跨线程操作winform程序窗体

我在本地系统中已经运行了程序A,然后再次运行程序A我们命名为A1。现在问题来了,我如何在运行A1的时候找到本地系统中已经运行了的程序A,并且在程序A1中实例化调用A程序的一个窗口并打开。求详解代码!

首先你这不是跨线程,而是跨进程,进程之间叫通讯.

你可以用socket,都是本机ip都统一更好操作.这儿挺好做的我就不给你说了.

给你说下判断进程是否在运行

 

doenet2.0 +

C# Code

//true代表在运行,false代表未运行. 
private bool CloseMethod(string exe)
        
            System.Diagnostics.Process[] myPs;
            myPs = System.Diagnostics.Process.GetProcesses();
            foreach (System.Diagnostics.Process p in myPs)
            
                if (p.ProcessName.ToLower() == exe.ToLower())
                
                    try
                    
                        return true;
                    
                    catch (Exception eKillProcess)
                    
                    
                
            
            return false;
        

追问

大神,我已经判断了是否运行了该程序了。现在我需要是的就是获取到运行的那个程序然后打开那个程序的窗体。你说可以用socket,都是本机ip都统一更好操作。麻烦大神具体点。最好有代码,我是做JAVA的,最近公司才让我做C#,很多都不懂。

追答

哦原来是做Java的牛人,怪不得感觉你的做法怪怪的.

在一台电脑是尽量用一个Exe,多个窗体,用户也感觉不出来到底几个程序还是窗体.

你现在这种跨进程也能做,但属于是把简单的需求改麻烦了.

还是建议你改回到一个exe.

我先给你写一个socket demo

已知 调用端A.exe  被调用端 B.exe

代码有字数限制.已发附件

 

参考技术A 你这样做的目的是什么,是为了在不同实例间进行数据通讯还是什么追问

我们打算是在A程序运行时,如果用户在次点击A程序,那么就判断A程序是否运行,若已经运行了A程序,那么就打开已经运行了的A的主窗体。并且结束第二次运行程序的所有线程。现在已经实现判断是否已经运行了A程序,并且可以结束第二次运行程序。现在问题是,无法获取到已经运行的A程序并且调用窗体。

追答

你的两次描述不太对,你的需求实际上就是简单的防重复运行,只是在此基础上增加了一个检测原有程序句柄并前置窗口的功能(也就是说程序在启动时,最先检查的就是是否有实例在运行,根本不会涉及到下一步的什么结束之类的),网上这种例子很容易找,比如http://www.bitscn.com/pdb/dotnet/200610/80379.html?jdfwkey=feknh1

追问

防止重复运行我是需要,但是我已经解决了防止重复运行。

这个是我写的防止重复运行的代码,我需要在if里面,也就是强制结束新开程序所有线程之前把已经运行的NMS程序获取到,并且打开已经运行了的NMS程序主的窗体。

以上是关于c# winform程序发布后运行时出现的一个问题的主要内容,如果未能解决你的问题,请参考以下文章

c#开发的winform程序,发布的x64的程序在x64电脑安装时出现未能找到vcredist_x64.exe错误

c# winform打包后,安装上之后没法运行?

C# winform程序运行几个小时后,程序未响应。如何排除这个问题?

c# winform 打包问题

asp.net工程编译时出现的有关NuGet的问题

C# MVC开发中在使用ADO.NET数据模型时出现的问题