Ho un progetto C# dll (my_cs_dll.dll
) che definisce una classe statica con una funzione membro statica.come si chiama una funzione gestita (C#) da C++?
namespace Foo
{
public static class Bar
{
public static double GetNumber() { return 1.0; }
}
}
Ho anche un progetto C++ dll che utilizza/clr.
#using <my_cs_dll.dll>
double get_number_from_cs() { return Foo::Bar::GetNumber(); }
ho aggiunto un riferimento alla 'my_cs_dll.dll'
nel C++ progetto Proprietà comuni sezione Riferimenti (Copia/dipendenze copia locale sono entrambi True).
E ho anche aggiunto il percorso a 'my_cs_dll.dll'
nel progetto C++ Proprietà di configurazione C/C++ Generale "Risolvi # utilizzando la sezione Riferimenti".
Tutto si genera senza errori, tuttavia in fase di esecuzione continuo a ricevere un'eccezione 'System.IO.FileNotFound' dal sistema che afferma che non è possibile trovare l'assembly my_cs_dll.dll
.
Entrambe le Dll sono sicuramente presenti nella stessa directory da cui sono in esecuzione.
Ho provato tutti i tipi di variazioni sulle impostazioni di cui sopra e leggere tutto ciò che ho potuto trovare su manged interoperabilità/non gestito, ma io non riesco a ottenere il mio cervello intorno a ciò che è sbagliato ...
I Sto usando VS2008 & .NET 3.5
Ciao Matt, "deve essere nella directory (o in una sottodirectory) in cui si trova l'eseguibile, in contrasto con la posizione del dll che sta usando" la DLL di sono annidate diverse sotto-directory sotto l'exe . Lo spostamento della DLL gestita nella stessa directory dell'eseguibile ha risolto il problema. Grazie !! – mark
OK, fantastico. Avevo l'impressione che finché la DLL si trovava in una sottodirectory dell'eseguibile, indipendentemente da quanto fosse profonda, l'assemblea sarebbe stata risolta. Ma come ho detto, è passato un po 'di tempo da quando ho guardato questo. –
Ho usato un codice simile durante il caricamento della DLL C# da una risorsa incorporata. Il trucco consisteva nel posizionare questo codice in un file che non faceva riferimento alla DLL C#. Sembra che il ritardo di caricamento di.Gli assembly netti si verificano quando si accede a un'unità di compilazione (un file .cpp) che contiene un riferimento all'assembly in questione, non quando la chiamata nell'assembly referenziato viene effettivamente realizzata, se mai. – mheyman