使用powershell加载C#DLL,[System.Type] :: GetType返回null

雏菊

我有一个像这样的简单DotNet DLL

namespace ClassLibrary1
{
    public class Class1
    {
        public static void Test()
        {
           Process.Start("CMD.exe", "/C calc"); 
        }
    }
}

当我尝试使用Powershell加载此DLL时

$Path      = "c:\\test\\ClassLibrary1.dll";
$Namespace = "ClassLibrary1";
$ClassName = "Class1";
$Method    = "Test";
$Arguments = $null

$Full_Path       = [System.IO.Path]::GetFullPath($Path);
$AssemblyName    = [System.Reflection.AssemblyName]::GetAssemblyName($Full_Path)
$Full_Class_Name = "$Namespace.$ClassName"
$Type_Name       = "$Full_Class_Name, $($AssemblyName.FullName)"
$Type            = [System.Type]::GetType($Type_Name)

$MethodInfo = $Type.GetMethod($Method)
$MethodInfo.Invoke($null, $Arguments)

它不起作用,因为[System.Type]::GetType($Type_Name)返回了$null

有任何想法吗?

mklement0
  • 使用Add-Type -Path加载程序集

  • 加载后,要通过字符串变量获取对该程序集[ClassLibrary1.Class1]类型的引用作为[Type]实例(用于反射),只需将其转换为即可[Type]

以下经过更正和带注释的代码版本演示了该方法:

# Compile the C# source code to assembly .\ClassLibrary1.dll
Add-Type -TypeDefinition @'
    namespace ClassLibrary1
    {
        public class Class1
        {
            public static void Test()
            {
            System.Diagnostics.Process.Start("CMD.exe", "/C calc"); 
            }
        }
    }
'@ -OutputAssembly .\ClassLibrary1.dll  


# Define the path to the assembly. Do NOT use "\\" as the path separator.
# PowerShell doesn't use "\" as the escape character.
$Path      = ".\ClassLibrary1.dll" 
$Namespace = "ClassLibrary1"
$ClassName = "Class1"
$Method    = "Test"
$Arguments = $null

# Load the assembly by its filesystem path, using the Add-Type cmdlet.
# Use of relative paths works.
Add-Type -Path $Path

$Full_Class_Name = "$Namespace.$ClassName"

# To get type [ClassLibrary1.Class1] by its full name as a string,
# simply cast to [type]
$Type            = [type] $Full_Class_Name

$MethodInfo = $Type.GetMethod($Method)
$MethodInfo.Invoke($null, $Arguments)

至于你尝试什么

正如PetSerAl指出的,[System.Type]::GetType()只有在以下情况下才能找到给定类型:

  • 它的程序集已经加载
  • 它的程序集可以通过标准程序集分辨率进行定位,如此处所述,其中涉及许多复杂的规则,其中只有两个适用于您的方案,如果您要尝试程序集或程序集中引用内置类型mscorlib位于GAC(全局程序集缓存)中。
    • 根据定义,只有强名称的程序集-用与程序集的全名中提到的公钥匹配的私钥签名的程序集-可以放在GAC中。

虽然您可能先调用它[System.Reflection.Assembly]::LoadFile($Full_Path)是为了通过其文件系统路径加载程序集,但此后[System.Type]::GetType($Type_Name)会成功,但最终使用起来更简单-而且使用PowerShell-idiomatic更为轻松Add-Type -Path(它的另一个优点是不需要加载完整(绝对)文件路径),并在加载后[Type]仅与类型的全名一起使用(不再需要引用程序集)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Type.GetType(“ System.Net.WebException”)返回null

C#:Type.GetType 为 System.Collections.Generic.Stack 返回 null

执行Type.GetType(“ System.Collections.Generic.SortedDictionary`2 [System.String,System.String]”)时返回null。

Type.GetType(“ namespace.abClassName”)返回null

C#:在动态加载的程序集的类上,Type.GetType为null

为什么type.Assembly.GetType(type.Name)返回null?

如果特定列的所有行都为空,则 Cursor.getType() 返回 FIELD_TYPE_NULL

在Type.GetType(..)== null上抛出什么?

使用Type动态返回null的Enum

使用哪个好:Object.GetType()== typeof(Type)或Object is Type?

在C#中,Type.FullName何时返回null?

无法使用Type.GetType(string)获取LinkedList`T的类型

为什么DapperRow.GetType()返回null?

使GetType匹配基类的type

从非托管C#DLL返回列表/数组

在V#的C#dll中返回string []

GetType返回Int而不是System.Int32

C#DLL注入未加载DLL

Type.GetTypeFromProgID()返回null,但是New-Object在Powershell中有效

如何使用ObservableCollection <T>中GetType返回的类型?

Type.GetType()不适用于C#代码中的F#类型

使用泛型方法在接口上调用Type.GetRuntimeMethod会返回null

如何从c#dll,c ++ / cli调用的dll返回字节数组,uint值

Activator.CreateInstance(Type T)返回null

Powershell的GetType

Golang:如何使用TYPE声明返回的变量?

使用 random.choices() 返回 <class 'type'>

System.DllNotFoundException: libpcsclite.so.1 assembly:<unknown assembly> type:<unknown type> member:(null)

为什么这些不一样?为什么在 C# 中`type.GetType() is Test` 不是真的?