A recent project at work was a Console C# application that used .Net 2.0's
LocalReport class to generate letters. To ease deployment, I prefer to distribute an application via copying instead of using an installer. A frequent problem for users of the LocalReport class is that it requires three assemblies that are not part of the .Net 2.0 Framework (but confusingly, are part of VS 2005). Whilst these assemblies can be installed (to the GAC) via Microsoft's ReportViewer
re-distributable (SP1), this breaks the principle of an xcopy install. The solution of course is to locate the required assemblies and mark them as CopyLocal in the project that requires them.
This should be no problem of course, as the first two assemblies show up in the .Net reference list:
- Microsoft.ReportViewer.WinForms.dll
- Microsoft.ReportViewer.Common.dll
Inspection of the second using Reflector reveals the third to be:
- Microsoft.ReportViewer.ProcessingObjectModel.dll
which
Reflector fails to locate - but why, if has been successfully installed? Even a search of the System partition fails to locate it.
The answer is the
platform agnostic GAC (%SystemRoot%\assembly\GAC_MSIL). Its contents are seemingly invisible to searching: the only way to access them is:
- Via the command-shell, e.g. via a command-prompt, cd/explorer into %SystemRoot%\assembly\GAC_MSIL.
- Via Microsoft's gacutil.exe.
Doing this allows you to locate the third assembly at:
- %SystemRoot%\assembly\GAC_MSIL\Microsoft.ReportViewer.ProcessingObjectModel\8.0.0.0__b03f5f7f11d50a3a
It can then be copied somewhere visible to the project (e.g. the application's lib directory) and added to the list of CopyLocal dependencies.