2015-06-05 19 views
6

Ich habe ein Problem beim Laden einer externen DLL mit Python durch Python für .NET. Ich habe verschiedene methodologis nach stackoverflow und ähnlichem versucht. Ich werde versuchen, die Situation zusammenzufassen und alle Schritte zu beschreiben, die ich gemacht habe.Python für .NET

Ich habe eine DLL namens z. Test.NET.dll. Ich überprüfte mit dotPeek und ich kann sehen, klicken Sie darauf, x64 und .NET Framework v4.5. Auf meinem Computer habe ich das .Net Framework 4 installiert.

Ich habe auch Python für .NET auf verschiedene Arten installiert. Ich denke, dass der beste Download die .whl von dieser Website LINK ist. Ich habe heruntergeladen und installiert: pythonnet-2.0.0.dev1-cp27-none-win_amd64.whl. Ich kann mir vorstellen, dass es für .NET 4.0 seit funktioniert. Benötigt das Microsoft .NET Framework 4.0.

Sobald ich alles installiert habe, kann ich diese Befehle tun:

>>> import clr 
>>> import System 
>>> print System.Environmnet.Version 
>>> print System.Environment.Version 
4.0.30319.34209 

Es Arbeit scheint. Dann habe ich versucht, meine dll Eingabe dieser Befehle zu laden:

>>> import clr 
>>> dllpath= r'C:\Program Files\API\Test.NET' 
>>> clr.AddReference(dllpath) 

Traceback (most recent call last): 
    File "<pyshell#20>", line 1, in <module> 
    clr.AddReference(dllpath) 
FileNotFoundException: Unable to find assembly 'C:\Program Files\API\Test.NET'. 
    at Python.Runtime.CLRModule.AddReference(String name) 

Ich habe auch versucht, hinzuzufügen ‚DLL‘ am Ende des Weges, aber nichts geändert. Dann habe ich auch verschiedene Lösungen ausprobiert, wie in LINK, LINK, LINK beschrieben, und vieles mehr .... Leider funktioniert es nicht und ich bekomme verschiedene Fehler. Ich weiß, dass IronPython existiert, aber ich habe versucht, es zu vermeiden.

Danke für Ihre Hilfe!

+0

1. hast du mit FindAssembly versuchen? 2. Haben Sie die Fehler von Assembly Binding Log Viewer (Fuslogvw.exe) untersucht? 3. Ihre Assembly ist 64-Bit, ist Python auch 64-Bit? – denfromufa

Antwort

1

Ist Test.NET.dll von einem anderen Computer gekommen? Laut this Thread können einige Sicherheitsfunktionen von .NET verhindern, dass .dlls schön geladen werden.

Für eine informative Fehlermeldung, versuchen

> from clr import System 
> from System import Reflection 
> full_filename = r'C:\Program Files\API\Test.NET' 
> Reflection.Assembly.LoadFile(dllpath) 

Wenn Sie eine Fehlermeldung nach dem Vorbild der

NotSupportedException: An attempt was made to load an assembly from a 
network location which would have caused the assembly to be sandboxed in 
previous versions of the .NET Framework. This release of the .NET Framework 
does not enable CAS policy by default, so this load may be dangerous. If 
this load is not intended to sandbox the assembly, please enable the 
loadFromRemoteSources switch. 

dann die folgende löste das Problem für mich bekommen:

  • Klicken Sie mit der rechten Maustaste auf Test.NET.dll
  • wählen Sie ‚Eigenschaften‘
  • unter der Registerkarte ‚Allgemein‘, klicken Sie auf ‚Freigeben‘
  • , klicken Sie auf ‚Übernehmen‘
1

Dies ist keine vollständige Antwort, aber helfen, für zukünftige Leser: Sie nicht vertrauen FileNotFoundException von clr.AddReference(dllpath) Leider sollte während Sondieren Baugruppen Ausnahmen

public static Assembly AddReference(string name) 
{ 
    AssemblyManager.UpdatePath(); 
    Assembly assembly = null; 
    assembly = AssemblyManager.LoadAssemblyPath(name); 
    if (assembly == null) 
    { 
     assembly = AssemblyManager.LoadAssembly(name); 
    } 
    if (assembly == null) 
    { 
     string msg = String.Format("Unable to find assembly '{0}'.", name); 
     throw new System.IO.FileNotFoundException(msg); 
    } 
    return assembly ; 
} 

AssemblyManager.LoadAssemblyPath Schwalben e geschluckt

usnahmen
try { assembly = Assembly.LoadFrom(path); } 
catch {} 

AssemblyManager.LoadAssembly Schwalben Ausnahmen zu

try { assembly = Assembly.Load(name);} 
catch (System.Exception e) {} 

Sie können die Liste der möglichen geschluckt Ausnahmen überprüfen in Assembly.LoadFrom und Assembly.Load, um herauszufinden, möglich wahren Gründe