【问题标题】:DesignAutomationClient() object creation fails with System.TypeLoadExceptionDesignAutomationClient() 对象创建失败并出现 System.TypeLoadException
【发布时间】:2020-08-27 23:24:42
【问题描述】:

我想我一定遗漏了一些明显的东西,但我试图创建一个新的 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 实例,然后使用它来创建我的工作项。

谁能帮忙?

【问题讨论】:

  • 嗨,@jh_dempsey,你有机会阅读一些文档here。希望对您有所帮助。
  • 嗨,Emma,我看过那个文件,但它似乎对我没有帮助。最初我在尝试创建 DesignAutomationClient 对象后设置了 clientID 和 secret,所以我将这些行移到了之前,但并没有什么不同。我没有创建网络服务。我正在创建一个简单的 Windows 窗体应用程序,这让我很难弄清楚我需要入门的哪些部分,而我不需要......
  • ``` 私有异步任务 createWorkItem() { var forgeConfig = new ForgeConfiguration(); forgeConfig.ClientId = 客户端ID; forgeConfig.ClientSecret = clientSecret; var apiInstance = new DesignAutomationClient(); ```

标签: c# autodesk-designautomation


【解决方案1】:

我们需要更多信息来进行故障排除,它是 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

【讨论】:

  • 不涉及 Web 服务器、Web 服务或 ASP。它是一个完全用 c# 编写的独立 Windows 窗体应用程序,用户在窗体上按下一个按钮来运行一个函数。该函数是您在 OP 中看到的代码。该函数应该创建一个新的 API 实例,然后使用它来创建一个新的工作项
猜你喜欢
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 2015-06-01
  • 2023-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多