在C#中调用静态方法

时间:2017-07-02 01:34:55

标签: c# visual-studio nfc

我实施了一个插件(使用pGina软件),允许用户通过扫描NFC标签验证其计算机中的用户名/密码。

我使用了一个名为CSharp PC/SC Wrapper for .NET的程序来读取标签ID。每次扫描标签时,程序都会将ID写入文本文件,并检查该ID是否与字符串上设置的ID相同。

if (userInfo.Username.Contains("hello") && userInfo.Password.Contains("pGina") 
  && text.Equals("UID  = 0x04 82 EC BA 7A 48 80"))

插件设置为查找读取ID的.exe文件(PC / SC Wrapper)。一切正常。但是,我不会将读者程序放在不同的文件中。我希望一切都在插件文件中。

我创建了一个方法并从执行标记ID(runme())读取的包装器中复制了代码,但是我不知道如何用方法替换调用.exe文件的行我创建了

ProcessStartInfo ps = new ProcessStartInfo(@"C:\Users\Student\Desktop\CSharpPCSC\CSharpPCSC\ExamplePCSCReader\bin\Release\ExamplePCSCReader.exe");

有什么建议吗?我是C#的新手

下面是我的插件代码,其中包含读取ID的代码的方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using pGina.Shared.Types;
using log4net;
using System.IO;
using System.Diagnostics;
using GS.PCSC;
using GS.Apdu;
using GS.SCard;
using GS.Util.Hex;
using System.Threading;

namespace HelloPlugin
{
    public class PluginImpl : pGina.Shared.Interfaces.IPluginAuthentication
    {
        private ILog m_logger;

        private static readonly Guid m_uuid = new Guid("CED8D126-9121-4CD2-86DE-3D84E4A2625E");

        public PluginImpl()
        {
            m_logger = LogManager.GetLogger("pGina.Plugin.HelloPlugin");
        }

        public string Name
        {
            get { return "Hello"; }
        }

        public string Description
        {
            get { return "Authenticates users with 'hello' in the username and 'pGina' in the password"; }
        }

        public Guid Uuid
        {
            get { return m_uuid; }
        }

        public string Version
        {
            get
            {
                return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
            }
        }

        public void Starting()
        {

        }

        public void Stopping() { }

        public BooleanResult AuthenticateUser(SessionProperties properties)
        {

            UserInformation userInfo = properties.GetTrackedSingle<UserInformation>();

            ProcessStartInfo ps = new ProcessStartInfo(@"C:\Users\Student\Desktop\CSharpPCSC\CSharpPCSC\ExamplePCSCReader\bin\Release\ExamplePCSCReader.exe");
            Process.Start(ps);
            Thread.Sleep(2000);
            string text = File.ReadAllText(@"C:\Users\Student\Desktop\text.txt", Encoding.UTF8);
            text = text.Trim();

            if (userInfo.Username.Contains("hello") && userInfo.Password.Contains("pGina") && text.Equals("UID  = 0x04 82 EC BA 7A 48 80"))
            {
                // Successful authentication
                m_logger.InfoFormat("Successfully authenticated {0}", userInfo.Username);
                return new BooleanResult() { Success = true };
            }
            // Authentication failure
            m_logger.ErrorFormat("Authentication failed for {0}", userInfo.Username);
            return new BooleanResult() { Success = false, Message = "Incorrect username or password." };
        }

        static void runme()
        {
            ConsoleTraceListener consoleTraceListener = new ConsoleTraceListener();
            Trace.Listeners.Add(consoleTraceListener);

            PCSCReader reader = new PCSCReader();
            string cardid = "";

            try
            {
                reader.Connect();
                reader.ActivateCard();

                RespApdu respApdu = reader.Exchange("FF CA 00 00 00"); // Get NFC Card UID ...
                if (respApdu.SW1SW2 == 0x9000)
                {
                    Console.WriteLine("UID  = 0x" + HexFormatting.ToHexString(respApdu.Data, true));
                    cardid = "UID  = 0x" + HexFormatting.ToHexString(respApdu.Data, true);
                    cardid = cardid.Trim();
                }
            }
            catch (WinSCardException ex)
            {
                Console.WriteLine(ex.WinSCardFunctionName + " Error 0x" +
                                   ex.Status.ToString("X08") + ": " + ex.Message);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                string path = @"C:\Users\Student\Desktop\text.txt";
                string text2write = cardid;

                System.IO.StreamWriter writer = new System.IO.StreamWriter(path);
                writer.Write(text2write);
                writer.Close();

                reader.Disconnect();
                Environment.Exit(0);
                Console.WriteLine("Please press any key...");
                Console.ReadLine();
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您已经创建了一个名为PluginImpl的类,并在该类中声明了方法runme。要从任何地方调用该方法,您需要编写PluginImpl.runme()

由于您已将类放入命名空间HelloPlugin - 如果调用*.cs文件位于不同的命名空间中,则顶部需要using HelloPlugin指令。 / p>

这就是全部!

我可能误解了您的问题,如果是,请重新提出您的问题并发送评论。

如果要替换

ProcessStartInfo ps = new ProcessStartInfo(
         @"C:\Users\Student\Desktop\CSharpPCSC\CSharpPCSC\"
        +"ExamplePCSCReader\bin\Release\ExamplePCSCReader.exe");

使用方法调用,你想要这样的东西

ProcessStartInfo ps = runme();

由于您是在类中调用静态方法,因此不需要PluginImpl.前缀。

好的,现在它会抱怨runme不会返回ProcessStartInfo。你需要改变runme才能这样做。 ProcessStartInfo的任何子类都可以。

static ProcessStartInfo runme()
{
   // ... Some code

   ProcessStartInfo toReturn = new ProcessStartInfo( //...
   );

   // ... More code

   return toReturn;
}