CrystalReport有个运行时组件,如果你是ClickOnce的话,客户端运行的时候需要先安装这个运行时组件。
一般做法是做一个setup.exe,然后用户通过主页的安装按钮,来下载并安装这个setup.exe。
setup.exe会打开WindowsInstaller,然后下载并安装这些需要的组件,比如
.NetFramework
.CrystalReport运行时组件 等
我今天要说这个编译时,不把CrystalReport的DLL给放到到编译后资源文件里,因为
1,这个会导致编译后资源文件变大
2,本来客户端已经安装了运行时组件了,实际上不需要这些DLL
下面来说说这些内容:
1,setup.exe打开的WindowInstaller都会下载并安装的组件,在哪里设置
右键Project,点击 属性,然后点击 发行,然后点击 必须组件 这个按钮(如图1),打开必须组件窗口(如图2)
<图1>
<图2> 我这里面需要 .NetFramework4.8和CrystalReport 两个组件。
这样,在主页点击按钮,去执行setup.exe的时候,就会先打开WindowsInstaller,下载并安装这两个组件了。
2,编译CrystalReport的DLL问题
不想把这个多余的DLL给放到编译后资源里,需要修改DLL的copy local 设置为 False 就可以了。
当然,需要把所以DLL都设置一遍,不要漏了。
设置之后呢,在上面图1中 应用程序文件 按钮里面,确认一下是不是 公开状况 变更成了 必须组件(自动) 了。
如此,在编译的话,就不会把DLL给放到编译后资源里面了。
<图3>
后记:这个local copy属性是干什么用的呢?
好像是把DLL给拷贝到GAC文件夹里用的。
然后,因为不想把DLL给放到编译后资源里,可以在图1中 应用程序文件 按钮里面,手动把CrystalReport 公开状况 变更成了 必须组件 ,就可以了。
但是,local copy为True的话, ※因为是默认为True,一般也没人改它,所以很可能是True
因为CrystalReport的DLL的特性----即,
64位的运行是组件,实际上内部使用的是32 位DLL
会导致
・64位应用程序,并且安装了64位CrystalReport运行组件,
・点击setup.exe的时候,因为会看GAC里有没有DLL,没有的话需要拷贝过去,于是出现下面图4的错误,让你安装32位的CrystalReport组件。
<图4>