Compile error - type resolution
Hello,
I have a basic workflow (xoml-only based) as following:
<SequentialWorkflowActivity x:Class="XomlWithRules.Workflow1" x:Name="Workflow1" xmlns:ns0="clr-namespace:XomlWithRules" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow">
<ns0:TestActivity x:Name="myActivity" IsTrue="False" />
</SequentialWorkflowActivity>
TestActivity is defined in the same console application (where it workflow is hosted). Whe I execute the following code:
WorkflowCompilerResults CompileWorkflow()
{
String[] assemblyNames = { "XomlWithRules.exe" };
WorkflowCompilerParameters parameters = new WorkflowCompilerParameters(assemblyNames);
parameters.OutputAssembly = "CustomWorkflow.dll";
parameters.LibraryPaths.Add(Path.GetDirectoryName(typeof(TestActivity).Assembly.Location));
WorkflowCompiler compiler = new WorkflowCompiler();
WorkflowCompilerResults compilerResults = compiler.Compile(parameters, wfFile);
foreach (CompilerError compilerError in compilerResults.Errors)
{
Console.WriteLine(compilerError.ToString());
}
return compilerResults;
}
I get the following error message:
error 347: Could not deserialize object. The type 'XomlWithRules.TestActivity' could not be resolved.} System.CodeDom.Compiler.CompilerError
The TestActivity is declared as:
public class TestActivity : System.Workflow.ComponentModel.Activity
{
public TestActivity()
{
this.Name = "myActivity";
}
private bool isTrue;
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public bool IsTrue
{
get { return isTrue; }
set { isTrue = value; }
}
protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
isTrue = true;
Console.WriteLine("Activity done : " + IsTrue.ToString());
return ActivityExecutionStatus.Closed;
}
}
Any idea ?
Thanks,
Pierre
[2365 byte] By [
pierreg] at [2007-12-19]
Hi Pierre,
I tried your example and ran into the same problem. The issue here is the following line:
xmlns:ns0="clr-namespace:XomlWithRules"
This namespace needs to have the assembly name tagged to it or there is no way that the compiler can resolve it. Here's what it should look like with the assembly info:
xmlns:ns0="clr-namespace:XomlWithRules;Assembly=XomlWithRules, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
Thanks!
Angel
Hello Angel,
I added the assembly info but when I compile the solution I get the following compilation error:
"A namespace does not directly contain members such as fields or methods D:\Code\WWF\XomlWithRules\Workflow1.xoml"
Consider that I upgraded to beta 2.2.
Thanks,
Pierre
Ok, I made further researches. When I execute with the suggested update I get the following error message:
"- [0] {error 347: Could not deserialize object. The type 'clr-namespace:XomlWithRules;XomlWithRules, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null.TestActivity' could not be resolved.} System.Workflow.ComponentModel.Compiler.ValidationError"
Consider that I have version 3.0.0.0 and not 1.0.0.0 (changing them the problem persists).
Thanks,
Pierre
Hello Angel,
you are right. Now the next problem is on the rules files:
<RuleDefinitions xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow">
<RuleDefinitions.Conditions>
<RuleExpressionCondition Name="TestIsTrue">
<RuleExpressionCondition.Expression>
<ns0:CodeBinaryOperatorExpression Operator="ValueEquality" xmlns:ns0="clr-namespace:System.CodeDom;Assembly=System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<ns0:CodeBinaryOperatorExpression.Left>
<ns0:CodePropertyReferenceExpression PropertyName="IsTrue">
<ns0:CodePropertyReferenceExpression.TargetObject>
<ns0:CodeCastExpression>
<ns0:CodeCastExpression.Expression>
<ns0:CodeMethodInvokeExpression>
<ns0:CodeMethodInvokeExpression.Parameters>
<ns0:CodePrimitiveExpression>
<ns0:CodePrimitiveExpression.Value>
<ns1:String xmlns:ns1="clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">myActivity1</ns1:String>
</ns0:CodePrimitiveExpression.Value>
</ns0:CodePrimitiveExpression>
</ns0:CodeMethodInvokeExpression.Parameters>
<ns0:CodeMethodInvokeExpression.Method>
<ns0:CodeMethodReferenceExpression MethodName="GetActivityByName">
<ns0:CodeMethodReferenceExpression.TargetObject>
<ns0:CodeThisReferenceExpression />
</ns0:CodeMethodReferenceExpression.TargetObject>
</ns0:CodeMethodReferenceExpression>
</ns0:CodeMethodInvokeExpression.Method>
</ns0:CodeMethodInvokeExpression>
</ns0:CodeCastExpression.Expression>
<ns0:CodeCastExpression.TargetType>
<ns0:CodeTypeReference ArrayElementType="{p11:Null}" BaseType="XomlWithRules.TestActivity" Options="0" ArrayRank="0" xmlns:p11="http://schemas.microsoft.com/winfx/2006/xaml" />
</ns0:CodeCastExpression.TargetType>
</ns0:CodeCastExpression>
</ns0:CodePropertyReferenceExpression.TargetObject>
</ns0:CodePropertyReferenceExpression>
</ns0:CodeBinaryOperatorExpression.Left>
<ns0:CodeBinaryOperatorExpression.Right>
<ns0:CodePrimitiveExpression>
<ns0:CodePrimitiveExpression.Value>
<ns1:Boolean xmlns:ns1="clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">true</ns1:Boolean>
</ns0:CodePrimitiveExpression.Value>
</ns0:CodePrimitiveExpression>
</ns0:CodeBinaryOperatorExpression.Right>
</ns0:CodeBinaryOperatorExpression>
</RuleExpressionCondition.Expression>
</RuleExpressionCondition>
</RuleDefinitions.Conditions>
</RuleDefinitions>
I get the error "error 1368: Activity 'ifElseBranchActivity1' validation failed: Property "Condition" has invalid value. Condition expression is invalid. The type name specified ("XomlWithRules.TestActivity") can not be resolved.} System.Workflow.ComponentModel.Compiler.ValidationError"
How can I indicate the assembly reference for the base type ?
Thanks,
Pierre