Introduction
From time to time, it is natural for us to deploy BizTalk solutions with Assembly dependencies. Usually this is because we have created helper classes (for mapping, or querying) or perhaps it reuses some common logic shared between application suites.
Whatever the reason, it can be very handy to pick up all assemblies when we export the BizTalk Application from BizTalk Administration, when we use the Export MSI feature/wizard.
The Problem
The one drawback is that, since BizTalk requires assemblies to be GAC’d (that is, strong named and added to the Global Assembly Cache), it’s hard for a tool, like the export to MSI wizard, to know what are custom assemblies which the BizTalk assemblies rely on (that aren’t system or framework assemblies).
In other words, you need a way to call out the dependencies, so that the export wizard will package the entire application. The alternative would be that you would have to ensure any custom dependencies are already deployed to your (new) target environment.
The Solution
As you might be aware, you can view a BizTalk application’s resources (assemblies) from within BizTalk Administrator. What you may not know is that you can add “Resources” to this location. In particular, you can add (or call out) dependency assemblies.
Just right click in the Resources view, and select Add->Resources..
A dialog pops up and allows you to browse for the required assemblie(s). You have some options here, you can force the assemblies to overwrite, you can select if and when the chosen assemblie(s) are GAC’d (registered with the GAC), registered as COM components or made visible to COM components.
The dependencies tab allows you to quickly see if all the dependencies for a specific assembly are to be found. This will help you check and ensure your solution has everything it needs.
When you decide to do an “Export to MSI”, you’ll notice that it now includes any dependency resource Assemblies which you have added to your application:
If the assembly you are adding has a dependency on another assembly that is not included in the application, the add operation will fail.
Great, but what if I want to automate this procedure as part of an automated deployment?
I’m glad you asked. Naturally, you can script commands which will accomplish this task for you. You could easily script this command, to be included in automated builds or deployments.
Note that, as a general rule, it is not advised to automatically register any assemblies in the Global Assembly Cache of a build machine/build server.
Steps to add assemblies from command line:
-
Open a command prompt as follows: Click Start, click Run, type cmd, and then click OK.
Note: you may require elevated permissions to accomplish this, you’ll certainly need permissions to administer BizTalk Server as well. -
Type the following command, substituting the appropriate values, as described in the following table.
Command Syntax:
BTSTask AddResource [/ApplicationName:value] /Type:System.BizTalk:BizTalkAssembly [/Overwrite] /Source:value [/Destination:value] [/Options:GacOnAdd|GacOnInstall|GacOnImport] [/Server:value] [/Database:value]
Example:
BTSTask AddResource /ApplicationName:MyApplication
/Type:System.BizTalk:BizTalkAssembly /Overwrite
/Source:"C:\BizTalk Assemblies\MyOrchestration.dll"
/Destination:"C:\New BizTalk Assemblies\
MyOrchestration.dll " /Server:MyDatabaseServer
/Database:BizTalkMgmtDb
The following is a complete list of options lifted from MSDN, but they approximate what you can do via the BizTalk Administrator console.
Parameter | Value |
---|---|
/ApplicationName |
Name of the BizTalk application to which to add the BizTalk assembly. If the application name is not specified, the default BizTalk application is used. If the name includes spaces, you must enclose it in double quotation marks ("). |
/Type |
System.BizTalk:BizTalkAssembly |
/Overwrite |
Option to update an existing assembly. If not specified, and an assembly already exists in the application that has the same LUID as the assembly being added, the AddResource operation fails. You can view the LUIDs for the artifacts in an application by using the ListApp Command. If another application depends on the assembly being overwritten, the AddResource operation fails, even when this parameter is specified. |
/Source |
Full path of the assembly file, including the file name. If the path includes spaces, you must enclose it in double quotation marks ("). |
/Destination |
Full path of the location where the assembly file is to be copied when the application is installed from the .msi file. If not provided, the assembly file is not copied to the local file system during installation. If the path includes spaces, you must enclose it in double quotation marks ("). |
/Options |
You must separate multiple options with a comma. |
/Server |
Name of the SQL Server instance hosting the BizTalk Management database, in the form ServerName\InstanceName,Port. Instance name is only required when the instance name is different than the server name. Port is only required when SQL Server uses a port number other than the default (1433). Examples: If not provided, the name of the SQL Server instance running on the local computer is used. |
/Database |
Name of the BizTalk Management database. If not specified, the BizTalk Management database running in the local instance of SQL Server is used. |
Further Reading
How to Add a BizTalk Assembly to an Application
http://msdn.microsoft.com/en-us/library/aa558703%28BTS.20%29.aspx
More on BizTalk Deployments
http://social.msdn.microsoft.com/Forums/en-US/biztalkgeneral/thread/1e6cd3a9-42d1-42b8-911c-c3f7bdc35145/