Командлет Add-Type: возможно ли указывать набор файлов DLL вместо имен сборок?

Мне нужно запустить командлет в PowerShell, размещенный внутри AutoCAD. Сборки AutoCAD (это хост PowerShell) не находятся в GAC. Как я могу правильно указать сборки AutoCAD? Можно ли указать набор файлов DLL вместо имен сборок? Все необходимые сборки уже загружены в текущий AppDomain.

$asm = ([System.AppDomain]::CurrentDomain.GetAssemblies()) | where { `
    ($_.FullName).StartsWith("acdbmgd") -or ($_.FullName).StartsWith("acmgd") `
    -or ($_.FullName).StartsWith("accoremgd")}

$src =[Io.File]::ReadAllText(($PSScriptRoot + "../Resources/example.cs"))

Add-Type -ReferencedAssemblies $asm -TypeDefinition $src -Language CSharp

# Launch our static `Bushman.CAD.PowerShellUtils.Example.WriteMsg()` method:
[Bushman.CAD.PowerShellUtils.Example]::WriteMsg("`nHello from CS-file!`n")

Это код ../Resources/example.cs файл:

using System;
using Autodesk.AutoCAD.Runtime;
using cad = Autodesk.AutoCAD.ApplicationServices.Application;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;


namespace Bushman.CAD.PowerShellUtils {
    public class Example {
        public static void WriteMsg(String msg) {
            Document doc = cad.DocumentManager.MdiActiveDocument;
            if (null == doc || String.IsNullOrEmpty(msg)) {
                return;
            }
            Editor ed = doc.Editor;
            ed.WriteMessage(msg);
        }
    }
}

Но я получаю ошибки:

Имя типа или пространство имен "DatabaseServices" отсутствует в пространстве имен "Autodesk.AutoCAD" (ссылка на сборку передается?).
Имя типа или пространство имен "Приложение" отсутствует в пространстве имен "Autodesk.AutoCAD.ApplicationServices" (ссылка на сборку передается?)

Как я могу это исправить?

1 ответ

Решение

Да, это возможно. Вам нужно использовать Location собственностью Assembly объект:

$asm = @(
    [System.AppDomain]::CurrentDomain.GetAssemblies() |
    Where-Object {
        $_.FullName.StartsWith("acdbmgd") -or
        $_.FullName.StartsWith("acmgd") -or
        $_.FullName.StartsWith("accoremgd")
    } |
    Select-Object -ExpandProperty Location
)
Другие вопросы по тегам