【问题标题】:Powershell ISE to run custom dll methodPowershell ISE 运行自定义 dll 方法
【发布时间】:2019-08-27 10:24:57
【问题描述】:

您好,我一直在尝试从我使用 powershell ise 创建的 dll 中运行一个方法。现在我已经使用 'dotnet foo.dll' 从 cmd 运行我的 dll,但我也想使用 powershell。

这是我的代码: 程序.cs

using System;

namespace ConsoleApp1
{
    public class Program
    { 
        public static void Main()
        {
            Console.WriteLine("Hello World!");
            Console.ReadKey();
        } 
    }
}

现在我在 VS2017 Enterprise 中使用 .net 核心框架创建了一个新的控制台应用程序。没有构建可执行文件后,我只得到了一个 dll 文件。我在网上进行了研究,发现如何使用 [Reflection.Assembly]::LoadFile("pathtofile") 加载 dll 文件 btw LoadWithPartialName 由于某种原因不起作用。

所以在加载后我尝试使用 [ConsoleApp1.Program]::Main() 调用 Main 方法,我得到了这个错误

Unable to find type [ConsoleApp1.Program].
At line:1 char:1
+ [ConsoleApp1.Program]::Main
+ ~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (ConsoleApp1.Program:TypeName)    [], RuntimeException
+ FullyQualifiedErrorId : TypeNotFound

请帮助我,我几个小时都找不到任何解决方案。

【问题讨论】:

    标签: c# powershell visual-studio-2015


    【解决方案1】:

    不确定这是否允许,但我在这里找到了答案:

    https://stackoverflow.com/a/12924252/3485669

    本质上,不是使用反射,而是使用 Add-Type:

    Add-Type -Path "<path to your dll>"
    

    之后,您应该可以使用您认为合适的[ConsoleApp1.Program]::Main()

    【讨论】:

    • 感谢您的回答,这只是给了我另一个错误。
    • Add-Type :无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息。在 line:1 char:1 + Add-Type -Path "C:\Users\User\Documents\Visual Studio 2017\Projects\C ... + ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~ + CategoryInfo : NotSpecified: (:) [Add-Type], ReflectionTypeLoadException + FullyQualifiedErrorId : System.Reflection.ReflectionTypeLoadException,Microsoft.PowerShell.Commands.AddTypeCommand
    • @NikolasPitsillos 您是否尝试直接加载源文件? (即[Reflection.Assembly]::LoadFile("Path\to\program.cs")
    • @NikolasPitsillos - 你使用的是什么版本的 powershell?
    • 版本 - 5.1.14393.953
    【解决方案2】:

    您的 DLL 不是 .NET FRAMEWORK DLL,它是 .NET CORE DLL

    您必须手动解决所有依赖项

    您的 dll 是 .Net 核心。您必须首先将所有 .Net 核心依赖项加载到您的 powershell 会话中。您可以通过

    检查丢失的依赖项
    add-type -Path C:\PathToYourDll\DllName.dll -PassThru
    $Error[0].Exception.LoaderExceptions
    

    您必须使用 .net 核心项目?因为对于 net core dll,将其加载到 powershell 会话中是不同的。

    【讨论】:

    • 我也会试试这个并回复你谢谢你的回答!
    【解决方案3】:

    您尝试将 .Net 核心程序集下载到 Powershell,但它使用的是 Net Framework。

    使用这个命令:

    add-type -Path C:\PathToYourDll\DllName.dll -PassThru
    

    你会看到这样的:

    "add-type : Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information."
    

    执行后:

    $Error[0].Exception.LoaderExceptions
    
    "Could not load file or assembly 'System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of i
    ts dependencies. The system cannot find the file specified." 
    

    首先,您需要为 .Net Core 加载所有依赖项。您可以在解决方案资源管理器->依赖项->SDK 下的 dll 的 Visual Studio 项目中找到它。

    但它可以很容易地完成,如果你让你的 dll 不是 .Net Core 项目,只是 .Net Framework 项目。在这种情况下,您只需下载您的 dll:

    并从 dll 执行函数:

    【讨论】:

    • 我也会试试这个,谢谢你的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 2019-02-26
    • 2017-04-17
    • 1970-01-01
    • 2013-10-02
    • 2022-10-21
    相关资源
    最近更新 更多