DesignAutomationClient对象创建失败,出现System.TypeLoadException

问题描述

我想我必须缺少一些明显的东西,但是我试图创建一个新的DesignAutomationClient对象,如下所示:

private void runDAButton_Click(object sender,EventArgs e)
        {
            createWorkItem();
        }

        private async Task createWorkItem()
        {
            var forgeConfig = new Autodesk.Forge.Core.ForgeConfiguration();
            forgeConfig.ClientId = clientID;
            forgeConfig.ClientSecret = clientSecret;

            var apiInstance = new DesignAutomationClient();            

            // Code to create work item will go here

        }

但是,当我这样做时,在尝试执行var apiInstance = new DesignAutomationClient();行之后,Visual Studio调试/立即窗口中出现以下错误

抛出异常:mscorlib.dll中的'System.TypeLoadException'

我缺少明显的东西吗?设计自动化客户端是使用NuGet下载的,因此我应该具有所有必需的依赖关系,但是在论坛中搜索此类错误都表示这意味着我丢失了DLL文件,或者我正在寻找的类型没有存在于DLL中,我认为都不是真的。

代码在用C#编写的简单Windows窗体应用程序中 不涉及Web服务器或ASP.NET。 用户单击运行runDAButton_Click函数(依次运行createWorkItem()函数)的窗体上的按钮。该函数应该创建API的实例,然后使用它来创建我的工作项。

有人可以帮忙吗?

解决方法

我们需要更多信息来进行故障排除,这是ASP .NET核心吗?您如何处理DI 但是,如果您的应用是.NET核心控制台应用,请从显示的代码中获取。 正确的方法是。

dotnet new console
dotnet add package Autodesk.Forge.DesignAutomation --version 3.0.3

代码:

namespace daconsole
{
    using Autodesk.Forge.Core;
    using Autodesk.Forge.DesignAutomation;
    using Autodesk.Forge.DesignAutomation.Model;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Options;
    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading;
    using System.Threading.Tasks;

    /// <summary>
    /// Defines the <see cref="ConsoleHost" />.
    /// </summary>
    class ConsoleHost : IHostedService
    {
        /// <summary>
        /// The StartAsync.
        /// </summary>
        /// <param name="cancellationToken">The cancellationToken<see cref="CancellationToken"/>.</param>
        /// <returns>The <see cref="Task"/>.</returns>
        public Task StartAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }

        /// <summary>
        /// The StopAsync.
        /// </summary>
        /// <param name="cancellationToken">The cancellationToken<see cref="CancellationToken"/>.</param>
        /// <returns>The <see cref="Task"/>.</returns>
        public Task StopAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }
    }

    /// <summary>
    /// Defines the <see cref="App" />.
    /// </summary>
    internal class App
    {
        /// <summary>
        /// Defines the api.
        /// </summary>
        public DesignAutomationClient api;

        /// <summary>
        /// Defines the config.
        /// </summary>
        public ForgeConfiguration config;

        /// <summary>
        /// Initializes a new instance of the <see cref="App"/> class.
        /// </summary>
        /// <param name="api">The api<see cref="DesignAutomationClient"/>.</param>
        /// <param name="config">The config<see cref="IOptions{ForgeConfiguration}"/>.</param>
        public App(DesignAutomationClient api,IOptions<ForgeConfiguration> config)
        {
            this.api = api;
            this.config = config.Value;
        }

        /// <summary>
        /// The CreateWorkItem.
        /// </summary>
        /// <returns>The <see cref="Task"/>.</returns>
        private async Task CreateWorkItem()
        {
            //step1:
            var forgeEnginesApi = api.EnginesApi;
            ApiResponse<Page<string>> engines = await forgeEnginesApi.GetEnginesAsync();
            if (engines.HttpResponse.IsSuccessStatusCode)
            {
                Console.WriteLine(JsonConvert.SerializeObject(engines.Content,Formatting.Indented));
            }

            //step2:
            Console.WriteLine("\nActiviy Start");
            var activitiesApi = api.ActivitiesApi;
            ApiResponse<Page<string>> activitiesResp = await activitiesApi.GetActivitiesAsync();
            List<string> listOfActivities = new List<string>();

            string activityName = null;
            if (activitiesResp.HttpResponse.IsSuccessStatusCode)
            {
                var page = activitiesResp.Content.PaginationToken;
                activitiesResp.Content.Data.ForEach(e => listOfActivities.Add(e));
                while (page != null)
                {
                    activitiesResp = await activitiesApi.GetActivitiesAsync(page);
                    page = activitiesResp.Content.PaginationToken;
                    activitiesResp.Content.Data.ForEach(e => listOfActivities.Add(e));
                }
                var activities = listOfActivities.Where(a => a.Contains("PlotToPDF")).Select(a => a);
                if (activities.Count() > 0)
                {
                    activityName = activities.FirstOrDefault();
                }

            }

            //step3:
            Console.WriteLine("\nWorkItem Start...");
            var workItemsApi = api.WorkItemsApi;
            ApiResponse<WorkItemStatus> workItemStatus = await workItemsApi.CreateWorkItemAsync(new Autodesk.Forge.DesignAutomation.Model.WorkItem()
            {
                ActivityId = activityName,Arguments = new Dictionary<string,IArgument>() {
                              {
                               "HostDwg",new XrefTreeArgument() {
                                Url = "http://download.autodesk.com/us/samplefiles/acad/blocks_and_tables_-_metric.dwg",Verb = Verb.Get
                               }
                              },{
                               "Result",new XrefTreeArgument() {
                                Verb = Verb.Put,Url = "azure blob storage url",Headers = new Dictionary<string,string>()
                                {
                                    { "Content-Type","application/octet-stream" },{ "x-ms-blob-type","BlockBlob" }
                                }
                               }
                              }
                             }
            });

            Console.Write("\tPolling status");
            while (!workItemStatus.Content.Status.IsDone())
            {
                await Task.Delay(TimeSpan.FromSeconds(2));
                workItemStatus = await workItemsApi.GetWorkitemStatusAsync(workItemStatus.Content.Id);

                Console.Write(".");
            }
            Console.WriteLine(JsonConvert.SerializeObject(workItemStatus.Content,Formatting.Indented));
        }

        /// <summary>
        /// The RunAsync.
        /// </summary>
        /// <returns>The <see cref="Task"/>.</returns>
        public async Task RunAsync()
        {
            await CreateWorkItem();
        }
    }

    /// <summary>
    /// Defines the <see cref="Program" />.
    /// </summary>
    internal class Program
    {
        /// <summary>
        /// The Main.
        /// </summary>
        /// <param name="args">The args<see cref="string[]"/>.</param>
        /// <returns>The <see cref="Task"/>.</returns>
        static async Task Main(string[] args)
        {
            var host = new HostBuilder()
                .ConfigureAppConfiguration(builder =>
                {
                    builder.AddEnvironmentVariables();
                    builder.AddForgeAlternativeEnvironmentVariables();
                }).ConfigureServices((hostContext,services) =>
                { // add our no-op host (required by the HostBuilder)
                    services.AddHostedService<ConsoleHost>();

                    // our own app where all the real stuff happens
                    services.AddSingleton<App>();

                    // add and configure DESIGN AUTOMATION
                    services.AddDesignAutomation(hostContext.Configuration);
                    services.AddOptions();
                })
                .UseConsoleLifetime()
                .Build();
            using (host)
            {
                await host.StartAsync();
                // Get a reference to our App and run it
                var app = host.Services.GetRequiredService<App>();
                await app.RunAsync();
                await host.StopAsync();
            }
        }
    }
}

将Forge Env添加到您的launchSettings.json

{
  "profiles": {
    "daconsole": {
      "commandName": "Project","environmentVariables": {
        "FORGE_CLIENT_SECRET": "","FORGE_CLIENT_ID": ""
      }
    }
  }
}

要运行:

dotnet run --launch-profile daconsole