当C#表达式使用引用类型时,活动引发异常

当C#表达式使用引用类型时,活动引发异常,c#,workflow-foundation-4,C#,Workflow Foundation 4,我有一个基本的“任务”活动。它从父序列的输入变量中获取值,并将它们放入父序列的输出变量中。如果我只是执行此复制操作,则一切正常,工作流也会成功完成。如果引入系统类型“Random”或项目枚举“ReportStatusType”,工作流将引发异常“抛出system.NotSupportedException:“表达式活动类型'CSharpValue'1'需要编译才能运行。” 我根据wf 4的一个示例创建了此工作流。我想我正在使用wf 4.5。我正在VS2013中工作,目标是.NET Framewo

我有一个基本的“任务”活动。它从父序列的输入变量中获取值,并将它们放入父序列的输出变量中。如果我只是执行此复制操作,则一切正常,工作流也会成功完成。如果引入系统类型“Random”或项目枚举“ReportStatusType”,工作流将引发异常“抛出system.NotSupportedException:“表达式活动类型'CSharpValue'1'需要编译才能运行。”

我根据wf 4的一个示例创建了此工作流。我想我正在使用wf 4.5。我正在VS2013中工作,目标是.NET Framework 4.5。我使用了使用IIS平台的“WCF工作流服务应用程序”模板。我正在使用“WCF测试客户端”调用服务并查看响应

此值表达式适用于:

new ExpenseReportConfirmation() {
       Amount = report.Amount,
       City = report.Amount,
       Client = report.Client,
       Employee = report.Employee,
       EndDate = report.EndDate,
       StartDate = report.StartDate,
       ReportID = 5
    };
此值表达式失败:

new ExpenseReportConfirmation() {
       Amount = report.Amount,
       City = report.Amount,
       Client = report.Client,
       Employee = report.Employee,
       EndDate = report.EndDate,
       StartDate = report.StartDate,
       ReportID = new Random().Next(0,5),
    };
我导入的名称空间如下所示:

如果我尝试在另一个赋值活动中创建ReportID,然后在上面所示的值表达式中引用它,这也会失败

这对我来说可能是一个新手错误,但我没有主意。其他人有吗?

C#表达式必须编译,而VB表达式没有

编译Xaml 编译后的XAML工作流支持C#表达式,这些工作流被编译为以.NET Framework 4.5为目标的C#工作流项目的一部分。编译后的XAML是Visual Studio中工作流创作的默认类型,在Visual Studio中创建的以.NET Framework 4.5为目标的C#工作流项目使用C#表达式

松散Xaml 松散XAML工作流支持C#表达式。加载和调用松散XAML工作流的工作流宿主程序必须以.NET Framework 4.5为目标,并且
CompileExpressions
必须设置为true(默认值为false).
若要将CompileExpressions设置为true,请创建一个
ActivityXamlServicesSettings
实例,将其
CompileExpressions
属性设置为true,并将其作为参数传递给
System.Activities.XamlIntegration.ActivityXamlServices.Load(System.IO.Stream)

如果未将
CompileExpressions
设置为true,将引发NotSupportedException,并显示类似以下消息:表达式活动类型“CSharpValue”“1”需要编译才能运行。请确保已编译工作流

C#表达式必须编译,而VB表达式则不需要

编译Xaml 编译后的XAML工作流支持C#表达式,这些工作流被编译为以.NET Framework 4.5为目标的C#工作流项目的一部分。编译后的XAML是Visual Studio中工作流创作的默认类型,在Visual Studio中创建的以.NET Framework 4.5为目标的C#工作流项目使用C#表达式

松散Xaml 松散XAML工作流支持C#表达式。加载和调用松散XAML工作流的工作流宿主程序必须以.NET Framework 4.5为目标,并且
CompileExpressions
必须设置为true(默认值为false).
若要将CompileExpressions设置为true,请创建一个
ActivityXamlServicesSettings
实例,将其
CompileExpressions
属性设置为true,并将其作为参数传递给
System.Activities.XamlIntegration.ActivityXamlServices.Load(System.IO.Stream)

如果未将
CompileExpressions
设置为true,将引发NotSupportedException,并显示类似以下消息:表达式活动类型“CSharpValue”“1”需要编译才能运行。请确保已编译工作流

发件人:

XAMLX工作流服务中支持C#表达式。当 工作流服务托管在IIS或WAS中,因此不需要执行其他步骤 必需,但如果XAML工作流服务是自托管的,则# 必须编译表达式。若要在 自托管XAMLX工作流服务,首先将XAMLX文件加载到 WorkflowService,然后将WorkflowService的主体传递给 使用C编译上一篇文章中描述的Expressions方法# “代码工作流”部分中的表达式。在以下示例中 加载XAMLX工作流服务,编译C#表达式,然后 然后打开工作流服务并等待请求

因此,您可以:

// Load the XAMLX workflow service.
WorkflowService workflow1 =
    (WorkflowService)XamlServices.Load(xamlxPath);

// Compile the C# expressions in the workflow by passing the Body to CompileExpressions.
CompileExpressions(workflow1.Body);

// Initialize the WorkflowServiceHost.
var host = new WorkflowServiceHost(workflow1, new Uri("http://localhost:8293/Service1.xamlx"));

// Enable Metadata publishing/
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(smb);

// Open the WorkflowServiceHost and wait for requests.
host.Open();
Console.WriteLine("Press enter to quit");
Console.ReadLine();
选项2-使用自定义主机工厂(可能更简单、更直接)

现在将工厂添加到web.config:

<system.serviceModel>
    <serviceHostingEnvironment>
        <serviceActivations>
             <add relativeAddress="WcfWorkflow.xalmx" service="WcfWorkflow.xalmx" factory="Namespace.CSharpWorkflowServiceHostFactory" />
        </serviceActivations>
    </serviceHostingEnvironment>
</system.serviceMode>

来自:

XAMLX工作流服务中支持C#表达式。当 工作流服务托管在IIS或WAS中,因此不需要执行其他步骤 必需,但如果XAML工作流服务是自托管的,则# 必须编译表达式。若要在 自托管XAMLX工作流服务,首先将XAMLX文件加载到 WorkflowService,然后将WorkflowService的主体传递给 使用C编译上一篇文章中描述的Expressions方法# “代码工作流”部分中的表达式。在以下示例中 加载XAMLX工作流服务,编译C#表达式,然后 然后打开工作流服务并等待请求

因此,您可以:

// Load the XAMLX workflow service.
WorkflowService workflow1 =
    (WorkflowService)XamlServices.Load(xamlxPath);

// Compile the C# expressions in the workflow by passing the Body to CompileExpressions.
CompileExpressions(workflow1.Body);

// Initialize the WorkflowServiceHost.
var host = new WorkflowServiceHost(workflow1, new Uri("http://localhost:8293/Service1.xamlx"));

// Enable Metadata publishing/
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(smb);

// Open the WorkflowServiceHost and wait for requests.
host.Open();
Console.WriteLine("Press enter to quit");
Console.ReadLine();
选项2-使用自定义主机工厂(可能更简单、更直接)

现在将工厂添加到web.config:

<system.serviceModel>
    <serviceHostingEnvironment>
        <serviceActivations>
             <add relativeAddress="WcfWorkflow.xalmx" service="WcfWorkflow.xalmx" factory="Namespace.CSharpWorkflowServiceHostFactory" />
        </serviceActivations>
    </serviceHostingEnvironment>
</system.serviceMode>

此问题与编译C#表达式无关,因为我在IIS下部署该服务并由它处理编译。此问题在阅读后得到解决。我的赋值活动值是这样编写的,并且在Random()函数
new ExpenseReportConfirmation() { Amount = report.Amount, City = report.City, Client = report.Client, Employee = report.Employee, EndDate = report.EndDate, StartDate = report.StartDate, ReportID = new Random().Next(0, 50) };