#c# #autodesk-designautomation
#c# #autodesk-designautomation
Вопрос:
Я думаю, что я, должно быть, упускаю что-то очевидное, но я пытаюсь создать новый объект 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
}
но когда я это делаю, в моем окне Visual Studio Debug / Immediate после попытки выполнить var apiInstance = new DesignAutomationClient();
строку появляется следующая ошибка:
Возникло исключение: ‘System.Исключение TypeLoadException’ в mscorlib.dll
Я упускаю что-то очевидное? Клиент автоматизации проектирования был загружен с помощью NuGet, поэтому у меня должны быть все необходимые зависимости, но поисковые запросы на форумах по такого рода ошибкам говорят, что это означает, что мне либо не хватает файла DLL, либо тип, который я ищу, не существует в DLL, ни один из которых, я считаю, не соответствует действительности.
Этот код находится в простом приложении Windows form, написанном на C #, в котором нет веб-серверов или ASP.NET задействовано. Пользователь нажимает кнопку в форме, которая запускает функцию runDAButton_Click (которая, в свою очередь, запускает функцию createWorkItem()). Эта функция должна создать экземпляр API, а затем использовать его для создания моего рабочего элемента.
Кто-нибудь может помочь?
Комментарии:
1. Привет, @jh_dempsey, у тебя есть возможность почитать какой-нибудь документ здесь . Надеюсь, это поможет.
2. Привет, Эмма, я видел этот документ, но, похоже, он мне не помогает. Первоначально я устанавливал ClientID и secret после попытки создать объект DesignAutomationClient, поэтому я переместил эти строки в before, но это ничего не изменило. Я не создаю веб-сервис. Я создаю простое приложение Windows Form, из-за чего мне сложно понять, какие части процесса начала работы мне нужны, а какие нет…..
3. « частная асинхронная задача createWorkItem() { var forgeConfig = new ForgeConfiguration(); forgeConfig. ClientID = идентификатор клиента; forgeConfig. clientSecret = clientSecret; var apiInstance = новый DesignAutomationClient(); «
Ответ №1:
Нам нужно больше информации для устранения неполадок, это ASP.СЕТЕВОЕ ядро? как вы обрабатываете DI, но если ваше приложение является консольным приложением .NET Core из кода, как это выглядит. Правильный способ сделать это.
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
Комментарии:
1. Веб-сервер, веб-службы или ASP не задействованы. Это автономное приложение Windows form, написанное исключительно на c #. Пользователь нажимает кнопку в форме, которая запускает функцию. Эта функция — это код, который вы видите в OP. Функция должна создать новый экземпляр API, а затем использовать его для создания нового рабочего элемента