添加类型 cmdlet:是否可以指向 DLL 文件的集而不是程序集名称

本文关键字:程序集 文件 DLL cmdlet 类型 是否 添加 | 更新日期: 2023-09-27 18:33:13

我需要在PowerShell中启动cmdled,该cmdled托管在AutoCAD内部。AutoCAD的程序集(它是PowerShell的主机(不在GAC中。如何正确指向 AutoCAD 的程序集?是否可以指向 DLL 文件的集而不是程序集名称?已在当前应用程序域中加载的所有必需程序集。

$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);
        }
    }
}

但是我收到错误:

"数据库服务"的类型或命名空间的名称在 命名空间 "Autodesk.AutoCAD" (程序集引用被传递?(。
"应用程序"的类型或命名空间的名称在 "Autodesk.AutoCAD.ApplicationServices"(程序集(的命名空间 引用已通过?

我该如何解决它?

添加类型 cmdlet:是否可以指向 DLL 文件的集而不是程序集名称

是的,这是可能的。您需要使用Assembly对象的Location属性:

$asm = @(
    [System.AppDomain]::CurrentDomain.GetAssemblies() |
    Where-Object {
        $_.FullName.StartsWith("acdbmgd") -or
        $_.FullName.StartsWith("acmgd") -or
        $_.FullName.StartsWith("accoremgd")
    } |
    Select-Object -ExpandProperty Location
)