Pregunta

Estoy intentando escribir una DLL utilizando el C # .NET Framework 2.0. Todo se compila bien, pero cuando intento acceder a la DLL de mi solicitud, se produce un error al intentar obtener la dirección de procedimiento. Por lo tanto, OpEd la DLL en Dependency Walker, y todas mis funciones públicas están desaparecidos!

Mi DLL, hasta el momento, es bastante sencillo:

namespace MyDll_Namespace
{
    public class MyDllClass
    {
        public static int Func1( /* params */ ) { /* ... */ }

        public static int Func2( /* params */ ) { /* ... */ }

        public static int Func3( /* params */ ) { /* ... */ }

        public static int Func4( /* params */ ) { /* ... */ }
    }
}

No hay mucho más, sólo unas pocas constantes y delegados definidos dentro de la clase, así como fuera de la clase en el espacio de nombres. Cualquier idea o sugerencia sería muy apreciada. Gracias.

Otros consejos

Dependency Walker es para Win32 DLL (que es código nativo ), no ensamblados .NET (que es código administrado ). No va a encontrar métodos en una clase arbitraria (incluso si son estáticos). Si necesita llamar a código administrado de código nativo, hay maneras de hacerlo, pero no es bastante .

Si desea utilizar el archivo DLL desde código administrado, que es mucho más fácil. Echa un vistazo a System.Assembly y Activador .

Un ejemplo de esto:

var assembly = Assembly.LoadFile(@"\path\to\your.dll");
var mydllclass_type = assembly.GetType("MyDllClass");
var instance = Activator.CreateInstance(mydllclass_type);

La instancia será un objeto. Para llamar a los métodos, es necesario utilizar la reflexión, ya que la interfaz no se conoce en tiempo de compilación.

Si va a crear un sistema de plugins, la mejor manera es tener una interfaz común o base abstracta para todos los plugins, y tener esa referencia por su programa. Los terceros que implementan un plugin, también harán referencia a este contrato. En este caso, la última línea cambia un poco:

var instance = (IMyDllClass)Activator.CreateInstance(mydllclass_type);

Ahora usted puede utilizar los métodos como en un objeto construido con regularidad.

Parte del problema aquí es que la dependencia Walker es una herramienta para aplicaciones nativas. No entiende el código administrado y por lo tanto no se mostrará cualquiera de los tipos + métodos administrados que usted ha definido.

Estoy confundido por esta línea en su pregunta

  

cuando intento acceder a la DLL de mi solicitud, se produce un error al intentar obtener la dirección de procedimiento

Esto suena un poco como un error que iba a ver en una aplicación nativa, no uno administrado. ¿Estás tratando de acceder al código C # desde una aplicación nativa? Si es así esto sólo puede hacerse a través de la magia COM y no a través de llamada directa. ¿Puede explicar con más detalle lo que está pasando aquí?

Trate .NET Reflector para ver exactamente lo que está dentro de su DLL construida (con el fin de asegurarse de que todo es la forma en que se supone que es). También asegúrese de que está en modo de lanzamiento, mientras que la construcción de su DLL antes de hacer referencia que ... No sé si va a cambiar nada, pero él valores de la prueba =)

Es necesario añadir una referencia a la DLL y el tiempo de ejecución automáticamente permitirá que llame a su función. Aquí hay un pequeño tutorial en la escritura de una biblioteca de clases .NET.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top