2017-08-21 26 views
1

pcapDotNet.Core.Dllファイルで定義されたクラスを使用するユーザー定義関数を作成しようとしています。私のC#のコードは以下の通りです:pcap 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() 

私はOSErrorの「などのエラーを与えることのpythonからcheckFunctionを呼び出すしようとしたとき:[WinError -532462766] Windowsエラー0xe0434352 "これは、関数がpcapファイルからLivePacketsDeviceクラスを使用しているためです。私は参照としてDLLを生成しながらpcapDotNet.Core.Dllファイルを埋め込んでいます。誰でもこの問題の解決策を教えてください。

答えて

0

多くの試用のあと、pcapDotNet DLLファイルをPythonインタプリタが存在するフォルダに置いたときに動作を開始しました。理由は分かりませんか?誰にでも分かりますか?

関連する問題