gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:12:12 35 4
gpt4 key购买 nike

我有一个像这样的简单 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

有什么想法吗?

最佳答案

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

  • 加载后,要通过字符串变量,只需转换为[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()只能在以下情况下找到给定类型:

  • 它的程序集已经加载
  • 它的程序集可以通过标准程序集解析定位,详见here ,其中涉及许多复杂的规则,其中仅有的两个可能适用于您的场景是,如果您尝试从 mscorlib 程序集中引用 built-in 类型,或者位于 GAC(全局程序集缓存)中的程序集。
    • 根据定义,只有 strongly-named 程序集 - 那些使用与程序集全名中提到的公钥相匹配的私钥签名的程序集 - 可以放在 GAC 中。

虽然您可以先调用 [System.Reflection.Assembly]::LoadFile($Full_Path) 以通过其文件系统路径加载程序集,然后调用 [System.Type ]::GetType($Type_Name) 会成功,使用 Add-Type -Path 加载程序集(添加了不需要完整(绝对)文件路径的优点),并且一旦加载,使用 [Type] 时仅使用 type 的 全名(不需要引用程序集了)。

关于c# - 使用 powershell 加载 C# DLL,[System.Type]::GetType 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51577241/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com