从我们的某个硬件供应商处理最近获得的dll(用于.NET sdk中的工作)。他们提供了所有的类,方法等体面的文档,但他们的所有例子都在C#中。我不熟悉C#,并且正在将所有内容翻译成PowerShell。我已经取得了一些进展,但遇到了困难,我正在寻求一些帮助。将第三方C#转换为PowerShell
这里是他们的C#示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Vendor.Components.Flashlight.Sdk.Examples
{
class MyApp
{
public void Execute()
{
var device = new FlashlightController();
device.Light(FlashlightColor.Green);
}
}
}
下面是我在哪里在PowerShell中至今(如果有一个更雄辩的方式,随时让我知道):
## Vendor DLL path
$assemblyFlashlight = 'C:\FlashlightDLL\Flashlight.Sdk.dll'
## Adding new assembly as a Type and listing members
$typeFlashLight = Add-Type -Path $assemblyFlashlight -PassThru
$typeFlashlight
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False DotfuscatorAttribute System.Attribute
True False BusylightController System.Object
True True BusylightSoundClip System.Enum
True True BusylightVolume System.Enum
True False BusylightColor System.Object
False False b System.Object
False False c System.Object
False False e System.Object
False False f System.Object
False False d System.Object
False False i System.ValueType
False False a System.ValueType
False False g System.Object
False False h System.ValueType
False True d System.MulticastDelegate
False False b System.ValueType
False False e System.Object
False False c System.Object
False False f System.Object
False False a d
False False a System.Object
## Creating objects
$objController = New-Object $typeFlashLight[1]
$objSoundClip = New-Object $typeFlashLight[2]
$objVolume = New-Object $typeFlashLight[3]
$objColor = New-Object $typeFlashLight[4]
以上PowerShell代码运行时没有错误,所有$ obj变量都包含预期成员:
$objColor|Get-Member
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
BlueRgbValue Property int BlueRgbValue {get;set;}
GreenRgbValue Property int GreenRgbValue {get;set;}
RedRgbValue Property int RedRgbValue {get;set;}
所以我想我正走在正确的轨道上。但我无法弄清楚如何翻译某些东西,如'IsPublic','IsSerial',而我在'Dotfuscator'上的研究并没有给我任何我可以消化的东西。
好的,够公平的。回想起来,我认为要求“转换”是夸大了需求。我真正需要的是能够与这个API进行交互,而无需掌握其他语言。是否可以包装PoSh代码中现有的C#代码?或者是花时间学习C#的唯一实用解决方案? – 2013-02-28 07:21:06
如果您只需调用API,那么您可能可以通过PowerShell执行此操作。不要担心Dotfuscator,因为它应该只使用非公共类型和类型成员的名称。顺便说一句,你应该能够通过类型名称来更新对象,例如new-object'<完全限定类型名称here>'-arg <构造器数组arg-here>。 – 2013-02-28 18:14:08
所以,“如果你只需要调用API,那么你可能会从PowerShell做到这一点”,呃?你能指点我一个资源吗?这个资源会给我用来做这些事情的原则吗?我知道每个API的构建都是不同的,但我想有些特定的“钩子”对于任何基于.NET的api都很常见。 – 2013-02-28 21:37:26