1

我正在尝试创建用户定义的函数,该函数使用 pcapDotNet.Core.Dll 文件中定义的类。我的 c# 代码如下:

using System;
using System.IO;
using System.Collections.Generic;
using PcapDotNet.Core;
using System.Linq;
using System.Runtime.InteropServices;
using RGiesecke.DllExport; //GANESH
using System.Runtime.InteropServices;//GANESH
using System.Reflection;

namespace ObtainingAdvancedInformationAboutInstalledDevices
{
    class Program1
    {

        /*
        static void Main(string[] args)
        {
            Program1 var1 = new Program1();
            var1.checkDevice();
        }*/ 

        public Program1()
        {
            AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly;
        }

        static Assembly ResolveAssembly(object sender, ResolveEventArgs args)
        {
            String dllName = new AssemblyName(args.Name).Name + ".dll";
            var assem = Assembly.GetExecutingAssembly();
            String resourceName = assem.GetManifestResourceNames().FirstOrDefault(rn => rn.EndsWith(dllName));
            if (resourceName == null) return null; // Not found, maybe another handler will find it
            using (var stream = assem.GetManifestResourceStream(resourceName))
            {
                Byte[] assemblyData = new Byte[stream.Length];
                stream.Read(assemblyData, 0, assemblyData.Length);
                return Assembly.Load(assemblyData);
            }
        }

        //**************************************USER DEFINED FUNCTIONS START*********************
        [DllExport("checkFunction", CallingConvention = CallingConvention.Cdecl)]//GANESH
        public static int checkFunction()
        {

            Program1 worker1 = new Program1();
            worker1.checkDevice();
            return 0;
        }


        void checkDevice()
        {
            // Retrieve the interfaces list
            IList<LivePacketDevice> allDevices = LivePacketDevice.AllLocalMachine;
            Console.WriteLine(" inside checkDevice\n");


            // Scan the list printing every entry
            for (int i = 0; i != allDevices.Count(); ++i)
                DevicePrint(allDevices[i]);

        }


        // Print all the available information on the given interface
        private static void DevicePrint(IPacketDevice device)
        {
            // Name
            Console.WriteLine(device.Name);

            // Description
            if (device.Description != null)
                Console.WriteLine("\tDescription: " + device.Description);

            // Loopback Address
            Console.WriteLine("\tLoopback: " +
                              (((device.Attributes & DeviceAttributes.Loopback) == DeviceAttributes.Loopback)
                                   ? "yes"
                                   : "no"));

            // IP addresses
            foreach (DeviceAddress address in device.Addresses)
            {
                Console.WriteLine("\tAddress Family: " + address.Address.Family);

                if (address.Address != null)
                    Console.WriteLine(("\tAddress: " + address.Address));
                if (address.Netmask != null)
                    Console.WriteLine(("\tNetmask: " + address.Netmask));
                if (address.Broadcast != null)
                    Console.WriteLine(("\tBroadcast Address: " + address.Broadcast));
                if (address.Destination != null)
                    Console.WriteLine(("\tDestination Address: " + address.Destination));
            }
            Console.WriteLine();
        }
    }
}

我的python代码如下:

class gooseDriver():
    """A class that creates windows form by importing IED.MainWindow()"""

    def __init__(self, ipAddress, port):

        self.hllDll = WinDLL (r"C:\WORK\IEC61850\gooseThread1\gooseThread1\bin\x64\Debug\gooseThread1.dll")       
        self.hllDll.checkFunction()

        print("Goose Message Started\n")   


def main():
    IED = gooseDriver("192.168.0.20", 102)
    print("GooseDriver is called\n")


if __name__ == '__main__':
    main()

当我尝试从 python 调用 checkFunction 时,错误为“OSError:[WinError -532462766] Windows Error 0xe0434352”。这是因为函数正在使用 pcap 文件中的 LivePacketsDevice 类。我在生成 DLL 作为参考时嵌入了 pcapDotNet.Core.Dll 文件。任何人都可以建议这个问题的解决方案。

4

1 回答 1

0

经过大量试验,当我将 pcapDotNet DLL 文件放入 Python 解释器所在的文件夹时,它开始工作。不知道是什么原因?任何人都可以知道这一点。

于 2017-08-29T16:50:14.057 回答