Использовать DLL в PowerShell - PullRequest
       23

Использовать DLL в PowerShell

0 голосов
/ 25 апреля 2019

Я пытаюсь использовать функцию из DLL в PowerShell. В настоящее время у меня есть код ниже, хотя это вызывает сбой при вызове функции. Я довольно новичок в этом, поэтому любая помощь приветствуется. Цель кода - использовать EloGetDiagnosticsData() в PowerShell для возврата SCREEN_PROPERTIES pData в PowerShell и использовать его в $variable.

$EloPath = "C:\\Program Files\\Elo Touch Solutions\\EloPubIf.dll"
$Signature = @"
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace EloPublicInterface
{
    [Flags]
    public enum CONTRL_STAT             // ctrl_status values
    {
        CS_OK                   = 0x00000000,
        CS_ConstantTouch        = 0x00000001,
        CS_CanNotFindController = 0x00000002,
        CS_NoResponse           = 0x00000003,
        CS_InvalidResponse      = 0x00000004,
        CS_CanNotSetBaudRate    = 0x00000005,
        CS_CommandNotSent       = 0x00000006,
        CS_SystemError          = 0x00000007,
        CS_InvalidCommPort      = 0x00000008,
        CS_CommPortFailedOpen   = 0x00000009,
        CS_CommPortCommandError = 0x00000010,
        CS_CommPortNoController = 0x00000011,
        CS_UndefinedController  = 0x00000012
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct SCREEN_PROPERTIES
    {
        private const int COMPORT_NAME_LENGTH = 256;
        public Int32        iWindowsMonNo ;
        public UInt32   Type;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = COMPORT_NAME_LENGTH)] // unicode
        public String Port;

        private const int SERIALNUMBER_NAME_LENGTH = 18;        
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=SERIALNUMBER_NAME_LENGTH)] // the rest is ansi
        public String SerialNumber;
        public UInt32   HardwareHandshaking ; 
        public CONTRL_STAT      ctrl_status;    
        public Int32            BaudRate;
        public SByte crevminor;
        public SByte crevmajor;
        public SByte trevminor;
        public SByte trevmajor;     
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=8)] 
        public String diagcodes;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=8)] 
        public String id;   
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=8)] 
        public String cnt_id;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)] 
        public String driver_id;
    }

    public class EloPubIf
    {
        private const int MAX_SUPPORTED_SCR = 256;

        [DllImport(@"$EloPath")]
        public static extern int EloGetScreenInfo([MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.I4, SizeConst = MAX_SUPPORTED_SCR)] [Out] UInt32[] dwMonNo, ref Int32 iScrCnt);

        [DllImport(@"$EloPath")]
        public static extern int EloGetDiagnosticsData(ref SCREEN_PROPERTIES pData, UInt32 nScrNo);

        [DllImport(@"$EloPath")]
        public static extern int EloGetSerialNumbers(UInt32 nScreenIndex, [In, Out] char[] pszUsbControllerSN, UInt32 nUsbControllerSNBufLen, [In, Out] char[] pszSensorSN, UInt32 nSensorSNBufLen);
    }
}
"@
Add-Type -TypeDefinition $Signature -Language CSharp

$EloProperties = New-Object -TypeName EloPublicInterface.SCREEN_PROPERTIES
[System.UInt32]$EloScreenNumber = 1

[EloPublicInterface.EloPubIf]::EloGetDiagnosticsData([ref]$EloProperties, $EloScreenNumber)

Выполнение этого в PowerShell ISE приводит к тому, что PowerShel ISE не отвечает и перезапускается самостоятельно.

1 Ответ

1 голос
/ 25 апреля 2019

Вы подтвердили, что ваша проблема была следующей:

Значение $EloPath используется внутри дословной строки во встроенном коде C # (@"..."), поэтому \ символов. не должен быть экранирован как \\ [1] ; Таким образом:

$EloPath = "C:\Program Files\Elo Touch Solutions\EloPubIf.dll"

[1] Обратите внимание, что в самой PowerShell \ никогда не требуется экранировать в строковых литералах, поскольку \ не является escape-символом. в PowerShell.
Экранирующий символ PowerShell - ` (обратный удар), а внутри двойные кавычки строк PowerShell он должен быть экранирован как ``, чтобы использоваться буквально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...