Edge: Hacer referencia a una DLL externa de terceros

Creado en 6 jun. 2013  ·  13Comentarios  ·  Fuente: tjanczuk/edge

Hola,

Tengo problemas para hacer referencia a una DLL externa desde el borde. Agregué la DLL a .NET GAL pero todavía no puedo hacer referencia desde dentro del borde.

var edge = require('edge');

var hello = edge.func(function () {/*

 var listCertificates = edge.func(function() {/*
 #r "System.dll"
 #r "BouncyCastle.Crypto.dll"

 using Org.BouncyCastle.Pkcs;
 using Org.BouncyCastle.Asn1.X509;
 using Org.BouncyCastle.Crypto.Generators;
 using Org.BouncyCastle.Crypto;
 using Org.BouncyCastle.Security;
 using Org.BouncyCastle.OpenSsl;
 using System.Text;
 using System.IO;

 async (data) =>
 {

 //Requested Certificate Name
 X509Name name = new X509Name("CN=Client Cert, C=NL");

 */});

¡Este es el error!

Uncaught System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: Unable to compile C# code.
----> Errors when compiling as a CLR library:
error CS0006: Metadata file 'BouncyCastle.Crypto.dll' could not be found
----> Errors when compiling as a CLR async lambda expression:
error CS0006: Metadata file 'BouncyCastle.Crypto.dll' could not be found
   at EdgeCompiler.CompileFunc(IDictionary`2 parameters)
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at ClrFunc.Initialize(Handle<v8::Value>* , Arguments* args) in c:\edge-master-2\edge-master\src\clrfunc.cpp:line 91 

Comentario más útil

He hecho snk de nombre seguro para la dll y luego agregué la dll a GAC. Funcionó perfecto.
También agregué el dll al directorio exe de nodejs.
Hasta ahora siguió su instrucción eborada. No funcionó.
Sería bueno si creara una documentación más clara que la información fragmentada.
Vi la documentación de la primera página en github, que no cubre la integración de dll externos.
Sería de gran ayuda si explicaras paso a paso cómo trabajar con un dll externo y el código c # de un dll asociado.

Todos 13 comentarios

Quieres decir que lo agregaste a GAC, no a GAL, ¿verdad? ¿Cuál es la salida de gacutil -l BouncyCastle.Crypto ?

¡Sí, lo siento GAC! La salida de gacutil -l BouncyCastle.Crypto es:

C:\GACkey>gacutil -l BouncyCastle.Crypto
Microsoft (R) .NET Global Assembly Cache Utility.  Version 4.0.30319.17626
Copyright (c) Microsoft Corporation.  All rights reserved.

The Global Assembly Cache contains the following assemblies:
  BouncyCastle.Crypto, Version=1.7.4114.6375, Culture=neutral, PublicKeyToken=aa
5196b1909f504b, processorArchitecture=MSIL

Number of items = 1

¿Hay algo que me esté perdiendo aquí?

Nada me salta. ¿Puede intentar crear una aplicación Hello, world C # simple y compilarla desde la línea de comandos mientras hace referencia a este dll?

csc.exe /r BouncyCastle.Crypto.dll hello.cs

OK Así que eliminé el BouncyCastle.Crypto.dll del GAC y luego creé una simple aplicación Hello, world C #, copié el BouncyCastle.Crypto.dll en el mismo directorio que el archivo hello.cs y luego hice esto:

csc.exe /reference:BouncyCastle.Crypto.dll Program.cs

Compiló bien y produce un .exe que se ejecutó bien y hacía referencia a BouncyCastle.Crypto.dll como esperaba.

Luego copié el BouncyCastle.Crypto.dll en mi carpeta node-webkit y ejecuté mi aplicación node-webkit / edge y funcionó.

Entonces, ¿no debería poder hacer referencia específicamente a la ubicación de BouncyCastle.Crypto.dll como lo hago en la línea de comando? Si es así, ¿dónde debería colocarlos para que sean accesibles a mi aplicación node-webkit / node.js / edge?

Pruebe en el mismo directorio que el node.exe que ejecuta su aplicación.

Sí, según mi comentario anterior, esto funciona.

La pregunta es, ¿es posible hacer referencia al archivo desde un directorio "lib"?

El #r debe aceptar un nombre de archivo completo. Alternativamente, también puede especificar ensamblajes de referencia usando esta sintaxis:

var mycsharpcode = function () {/*
   .... the C# goes here
*/};

var myfunc = edge.func({
    source: mycsharpcode,
    references: [ 'c:\\mydirectory\\BouncyCaste.dll' ]
});

La ubicación completa del sistema de archivos de referencia se puede calcular utilizando __dirname.

@tjanczuk , hice lo que dijiste:

var path = "C:\\Program Files\\nodejs";
var test = edge.func({ 
    assemblyFile: "APITest.dll", 
    typeName: "APITest.Startup", 
    methodName: "Invoke", 
    references: [
        (path + "\\dll\\MyApp.Entity.dll")
    ] 
}); 

La carpeta dll está en el mismo directorio que node.exe.

También arroja el error cuando se llama a la función test : ... No se pudo cargar el archivo o ensamblado 'MyApp.Entity ...

Está bien si MyApp.Entity.dll está en el mismo directorio que node.exe. Pero no es muy agradable.

¿Qué versión de edge y edge-cs estás usando? Edge 0.7.12 y edge-cs 0.2.4 hacen que este escenario funcione después de corregir https://github.com/tjanczuk/edge-cs/commit/7b510b3b3d5bcac3f225c6be49cfc61c1ec1a1aa.


De: Abel [[email protected]]
Enviado: viernes, 05 de julio de 2013 1:39 a. M.
Para: tjanczuk / edge
Cc: Tomasz Janczuk
Asunto: Re: [edge] Haciendo referencia a una DLL externa de terceros (n. ° 62)

@tjan czukhttps: //github.com/tjanczuk , hice lo que dijiste:

var path = "C: \ Archivos de programa \ nodejs";
var test = edge.func ({
AssemblyFile: "APITest.dll",
typeName: "APITest.Startup",
nombreMétodo: "Invocar",
referencias: [
(ruta + "\ dllMyApp.Entity.dll")
]
});

La carpeta dll está en el mismo directorio que node.exe.

También arroja el error cuando se llama a la función de prueba: ... No se pudo cargar el archivo o ensamblado 'MyApp.Entity ...

Está bien si MyApp.Entity.dll está en el mismo directorio que node.exe. Pero no es muy agradable.

-
Responda a este correo electrónico directamente o véalo en Gi

@tjanczuk , lo siento. Fue mi error. Mi dll MyApp.Entity.dll tenía un archivo de mapeo. Deben estar en la carpeta bin en el proyecto .NET. Entonces, usando edge.js, debería estar debajo de la carpeta NodeJS junto a node.exe .

También estoy recibiendo el mismo error, por favor, alguien me ayude

var edge = require('edge');

var helloWorld = edge.func({assemblyFile:'MR6100Api.dll',typeName:'MR6100Api.MR6100Api',
    methodName: 'isNetWorkConnect',
    references: [
        ("C:\\Users\\killer\\Documents\\hello\\sample\\MR6100Api.dll")
    ] 
});

helloWorld('127.0.0.1', function (error, result) {
    if (error) throw error;
    console.log(result);
});

Excepción

    return edge.initializeClrFunc(options);
                ^
Error: Could not load file or assembly 'file:///C:\Users\killer\Documents\hello\sample\MR6100Api
.dll' or one of its dependencies. An attempt was made to load a program with an incorrect format.
    at Error (native)
    at Object.exports.func (C:\Users\killer\Documents\hello\sample\node_modules\edge\lib\edge.js
:154:17)
    at Object.<anonymous> (C:\Users\killer\Documents\hello\sample\server.js:3:23)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
    at node.js:814:3

Por favor, ayúdame

He hecho snk de nombre seguro para la dll y luego agregué la dll a GAC. Funcionó perfecto.
También agregué el dll al directorio exe de nodejs.
Hasta ahora siguió su instrucción eborada. No funcionó.
Sería bueno si creara una documentación más clara que la información fragmentada.
Vi la documentación de la primera página en github, que no cubre la integración de dll externos.
Sería de gran ayuda si explicaras paso a paso cómo trabajar con un dll externo y el código c # de un dll asociado.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

0xF6 picture 0xF6  ·  4Comentarios

tdupuy17 picture tdupuy17  ·  6Comentarios

WinterWoods picture WinterWoods  ·  10Comentarios

timonsku picture timonsku  ·  4Comentarios

EricSmekens picture EricSmekens  ·  7Comentarios