Domanda

Sto tentando di scrivere una DLL utilizzando il C # .NET Framework 2.0. Tutto compila bene, ma quando provo ad accedere al DLL da mia domanda, non riesce quando si tenta di ottenere l'indirizzo di procedura. Così, ho OpEd la DLL in Dependency Walker, e tutte le mie funzioni pubbliche mancano!

La mia DLL, finora, è abbastanza semplice:

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 */ ) { /* ... */ }
    }
}

Non c'è molto altro, a pochi costanti e delegati definite all'interno della classe, così come al di fuori della classe nello spazio dei nomi. Ogni pensiero o suggerimenti molto sarebbero apprezzati. Grazie.

Altri suggerimenti

Dipendenza Walker è per Win32 DLL (che è codice nativo ), non assembly .NET (che è codice gestito ). Non troverà metodi in una classe arbitraria (anche se sono statiche). Se avete bisogno di chiamare il codice gestito dal codice nativo, ci sono modi di fare che, ma non è abbastanza .

Se si desidera utilizzare la DLL dal codice gestito, è molto più facile. Scopri System.Assembly e Activator .

Un esempio di questo:

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

L'istanza sarà un oggetto. Per chiamare i metodi, è necessario utilizzare la riflessione, perché l'interfaccia non è noto al momento della compilazione.

Se si sta creando un sistema di plugin, il modo migliore è quello di avere un'interfaccia comune o di base astratta per tutti i plugin, e che hanno fatto riferimento dal programma. Quei terzi che implementano un plugin, sarà anche fare riferimento a questo contratto. In questo caso, l'ultima riga cambia un po ':

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

Ora è possibile utilizzare i metodi come in un oggetto regolarmente costruito.

Una parte del problema è che Dependency Walker è uno strumento per applicazioni native. Essa non capisce codice gestito e quindi non visualizzerà uno qualsiasi dei tipi gestite + metodi che avete definito.

Sono confuso da questa linea nella tua domanda

  

quando provo ad accedere al DLL da mia domanda, non riesce quando si tenta di ottenere l'indirizzo di procedura

Questo suona un po 'come un errore vedrei in un'applicazione nativa, non uno gestito. Stai cercando di accedere al codice C # da un'applicazione nativa? Se è così questo può essere fatto solo attraverso la magia COM e non tramite chiamata diretta. Può spiegare più in dettaglio cosa sta succedendo qui?

Prova .NET Reflector per vedere esattamente cosa c'è dentro la DLL costruzione (al fine di assicurarsi che tutto è il modo in cui si suppone). Assicurarsi inoltre che si è in modalità di rilascio, mentre la costruzione la DLL prima di riferimento ... Io non so se sta andando a cambiare nulla, ma ne valga la prova =)

È necessario aggiungere un riferimento alla DLL e il runtime automaticamente permetterà di chiamare la vostra funzione. Ecco un po ' esercitazione sulla scrittura di una libreria di classi .NET.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top