Hi
A guy (I think it is a guy, anyways :-) ) on the microsoft.public.biztalk.orchestration newsgroup has a problem with this issue. And since I had the issue myself a long time ago, and always wanted to write a quick blog entry about it, this seemed like a perfect time for it :-)
A quick note: This issue appears on both BizTalk 2004 and BizTalk 2006.
So basically, the problem is: When compiling a BizTalk project, you get the "'projectname.orchestrationname': cannot resolve imported 'service'" error. This occurs when you are compiling a project that has an orchestration inside it, that calls another orchestration in another project that again calls an orchestration in a third project. Confused? I bet! I will give you details, screenshots and explanations in just a few lines.
The quick answer is: The project you are trying to compile must reference the third project.
BUT, to the long answer:
I have created a solution with three projects:
- ProjectA with ABCSchema.xsd and OrchestrationA.odx
- Orchestration A does this
- Receive a message of type ABCSchema.xsd
- Initialize a string variable to receive the value from a distinguished field in ABCSchema
- Write the value to the eventlog
- Call OrchestrationB
- ProjectB with OrchestrationB.odx
- Orchestration B does this:
- Receive the string parameter from OrchestrationA
- Write the value to the eventlog
- Call OrchestrationC
- ProjectC with OrchestrationC.odx
- Orchestration C does this:
- Receive the string parameter from OrchestrationB
- Write the value to the eventlog
Screenshots:
The (very small) schema:
OrchestrationA:
OrchestrationB:
OrchestrationC:
No hokus pokus at all!
In order to call OrchestrationC from OrchestrationB, I added a reference to ProjectC from ProjectB. Both ProjectB and ProjectC compile just fine.
In order to call OrchestrationB from OrchestrationA, I add a reference to ProjectB from ProjectA, but ProjectA wont compile. I get this error:
The famous "cannot resolve imported 'service'" error.
BUT, referencing ProjectC from ProjectA solves this issue, and I can compile just fine.
Actually, the error description indicates it. When compiling ProjectA, it can't import the "ProjectC.OrchestrationC" service. But often, you are maybe compiling the entire solution, and you just see that the file in quesion is projectb.dll. But the error just states that ProjectA cannot import ProjectC.OrchestrationC, which it needs to according to projectb.dll.
Should anyone think that it is really silly that ProjectA needs to reference a dll that another dll references and that this breaks all nice architectures, I would agree. If someone gives me a set of 20 dll's that make up a nice solution he/she has made, and I need to call an orchestration in one of them, then I also need to reference all the dll's that this one dll references, assuming there are internal "Call Orchestration"s between these dll's. I will need to know how these dll's reference eachother in order to reference one of them. Really silly, indeed.
I don't know why they have made it like this, but they have.
I hope this post helps others.
Should you have comments, please don't hesitate... My three projects can be found here: A_calls_B_calls_C.zip (137,08 KB)
--
eliasen