- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是一篇很长的文章,请耐心等待。
这个想法是,当应用程序引用 Core.dll(见下文)时,将创建一个类型为 Core
的新对象,并且在这样做时,构造函数将扫描 C:\Problems
文件夹,用于包含使用 IPlugin
接口(interface)的类型的任何 DLL。
当我从控制台应用程序引用 Core.dll 时它起作用。当我从 PowerShell 执行等效操作时,它不起作用,除非 Core.dll 在 GAC 中。
这些是细节:
我有一个程序集 (Core.dll),它是以下内容的结果:
public class Core
{
List<IPlugin> plugins = new List<IPlugin>();
public Core(string path)
{
LoadPlugins(path);
foreach (IPlugin plugin in plugins)
plugin.Work();
}
void LoadPlugins(string path)
{
foreach (string file in Directory.GetFiles(path))
{
FileInfo fileInfo = new FileInfo(file);
Assembly dllAssembly = Assembly.LoadFile(file);
foreach (Type type in dllAssembly.GetTypes())
{
Type typeInterface = type.GetInterface("Problems.IPlugin");
if (typeInterface != null)
plugins.Add((IPlugin)Activator.CreateInstance(
dllAssembly.GetType(type.ToString())));
}
}
}
}
public interface IPlugin
{
string Name {get; set;}
void Work();
}
然后,我有一个单独的程序集 MyPlugin.dll,其中包含以下内容:
public class MyPlugin : IPlugin
{
public string Name { get; set; }
public void Work()
{
Console.WriteLine("Hello, World. I'm a plugin!");
}
}
我用第三个项目 TestApp.exe(以 Core.dll 作为引用)测试了这一切:
static void Main(string[] args)
{
Core core = new Core(@"C:\Problems");
Console.ReadLine();
}
我将 Core.dll 和 MyPlugin.dll 都放到了 C:\Problems 中,TestApp.exe 运行得非常棒!所以,我编写了这个 PowerShell 脚本:
Add-Type -Path "C:\Problems\Core.dll"
$core = New-Object Problems.Core "C:\Problems"
这是我的结果(想象一堆红色):
New-Object : Exception calling ".ctor" with "1" argument(s): "Unable to load one or more o
f the requested types. Retrieve the LoaderExceptions property for more information."
At line:1 char:11
+ New-Object <<<< Problems.Core "C:\Problems"
+ CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvocationException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
深入研究异常,我发现:
PS C:\Problems> $Error[0].Exception.InnerException.LoaderExceptions
Could not load file or assembly 'Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
到目前为止,我的结论是,当我将 GetTypes() 作为插件加载程序的一部分运行时,它看到 MyPlugin 继承自 Problems.IPlugin,它不知道在哪里可以找到它。但是,我不是已经在 Core.dll 中加载它了吗?
我能解决这个问题的唯一方法是签署 Core.dll 程序集并将其添加到 GAC,但这既烦人又不符合我的目的。
(所有类都在 Problems 命名空间中,我省略了大量清理和过滤逻辑来说明问题。)
最佳答案
您可以通过查看正确的位置来确保处理程序集解决问题来解决此问题,即将您的核心类更改为如下所示:
public class Core
{
List<IPlugin> plugins = new List<IPlugin>();
string path;
public Core(string path)
{
this.path = path;
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
LoadPlugins();
foreach (IPlugin plugin in plugins)
plugin.Work();
}
Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var currentAssemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (var assembly in currentAssemblies)
{
if (assembly.FullName == args.Name)
{
Console.WriteLine("resolved assembly " + args.Name + " using exising appdomain");
return assembly;
}
}
var file = args.Name.Split(new char[] { ',' })[0].Replace(@"\\", @"\");
var dll = Path.Combine(path, file) + ".dll";
Console.WriteLine("resolved assembly " + args.Name + " from " + path);
return File.Exists(dll) ? Assembly.LoadFrom(dll) : null;
}
void LoadPlugins()
{
foreach (string file in Directory.GetFiles(this.path, "*.dll"))
{
FileInfo fileInfo = new FileInfo(file);
Assembly dllAssembly = Assembly.LoadFile(file);
foreach (Type type in dllAssembly.GetTypes())
{
Type typeInterface = type.GetInterface("Problems.IPlugin");
if (typeInterface != null)
plugins.Add((IPlugin)Activator.CreateInstance(
dllAssembly.GetType(type.ToString())));
}
}
}
}
关于c# - 为什么 Powershell 看不到它已经加载了这个程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10944771/
我正在寻找实现 PowerShell 提供程序 在 电源外壳。 我一直在想,如果我只是定义类型,然后将它们导入我的 session (导入模块),我应该能够让它们可用。 例如,这个 不工作但它沿着我想
我创建的脚本使用了组件,这些组件仅在32位版本的Powershell中可用。 默认情况下,Windows使用Powershell x64执行脚本,这会导致一些错误。 是一种在脚本开头设置值以强制Win
是否可以从 Powershell 中检测它是否是嵌套 shell? 如果我打开 Powershell 或 cmd.exe 窗口,然后输入 powershell 在那里,是否有一个神奇的 $host.s
随着 PowerShell Core 的发布,应用程序在使用托管自动化库 (system.management.automation) 时如何选择调用哪个版本的 Powershell(Powershe
最近,我加入了我企业的 Windows 团队,凭借我的开发人员背景(一般是 Java、.NET 和 Web),我很快就对 PowerShell 产生了兴趣。我可以看到它比普通的旧批处理文件、VB 更有
假设我有一个 powershell 脚本,它在我当前路径的相对路径中包含一个 Powershell 哈希。让我们称之为“name.ps1”,它包含: $names = @{ "bob" = "b
我想为我正在构建的自定义 Powershell Commandlet 使用 SqlServerCmdletSnapin。如果我将以下代码添加到 PSM1 的开头: if ( (Get-PSSnapin
如何调用从 PowerShell 脚本中获取命名参数的 PowerShell 脚本? foo.ps1: param( [Parameter(Mandatory=$true)][String]$a=''
我即将为 Windows 管理员编写一个 PowerShell 脚本,以帮助他们完成与部署 Web 应用程序相关的某些任务。 有什么理由让我应该赞成或排除开发 PowerShell 模块 (.psm1
我的 powershell 模块有一个函数,我希望它返回一个非零退出代码。但是,作为一个模块函数,当我运行 Import-Module 时,它会加载到 powershell 控制台的上下文中。所以,当
我在这个问题上花了最后 4 个小时,非常感谢您提供的任何意见。 我需要使用不同的凭据调用 powershell 脚本并将参数传递给该脚本。 安装 WISEScript 中包装的程序后,此脚本开始收集机
我有一个场景,我需要将 powershell 命令的命令和输出转发到另一个进程以进行日志记录和处理。 我希望这个控制台尽可能接近 powershell,因此不希望将它简单地托管在另一个控制台程序中。
我正在尝试让一个主 PowerShell 脚本运行所有其他脚本,同时等待 30-60 秒以确保完成任务。我尝试过的所有其他操作都不会停止/等待第一个脚本及其进程完成,然后才能同时完成所有其他脚本,并且
我正在编写一个脚本来使用多个 plink (PuTTY) session 作为 Windows 版本的 clustersh。然而,我陷入困境,因为我想从 powershell 打开多个 Powersh
我读了这个答案:How to Open Powershell from Powershell start powershell 这将打开基础的大分辨率 PS 实例。如何打开 PS(x86)? 最佳答案
我很想知道我们是否可以在 Powershell 中做到这一点。 使用 Out-File 命令,我们可以通过管道将其输出写入文件。这样我就可以将我所有的历史命令发送到一个文本文件中。 问题是我可以在每次
我在 about_Pipelines 阅读了有关 PowerShell 中的管道工作原理的信息,并了解到管道一次传送一个对象。 所以,这个 Get-Service | Format-Table -Pr
我正在尝试像这样从 powershell 启动一个进程:- $proc = (start-process $myExe -argumentList '/myArg True' -windowStyle
## To run the script # .\get_status.ps1 -Hostname -Service_Action -Service_Name #$Hostname = "hos
让我们使用 powershell 命令 Write-Host "red text"-Fore red这会在红色前景中显示“红色文本”。 但是,您希望文本以稍微亮一点的方式显示字体颜色,浅红色。 有没有
我是一名优秀的程序员,十分优秀!