Comment un programme C # peut-il utiliser une dll C ++ de toute version?

Nous créons une dll, écrite en C ++, permettant d’accéder à certains matériels. Nous avons également un programme C # qui utilise cette dll.

Nous avons un problème avec les versions. En effet, lors de l’exécution du programme C #, il veut absolument utiliser la version exacte de la DLL C ++ utilisée lors de la compilation. Par exemple, si le programme C # a été compilé à l’aide de la DLL C ++ 1.2.3.4, il refusera de s’exécuter avec la DLL C ++ 1.2.3.5.

Je voudrais demander au programme C # d’utiliser n’importe quelle dll C ++ avec la version 1.2.anything.

Où puis-je configurer cela dans le projet C #?

Cette question a été remplacée par celle-ci , plus liée à COM.

Rien de cette fantaisie n’existe en C ++. L’utilisation d’un manifeste côte à côte le permet techniquement, mais vous l’auriez su puisque vous auriez saisi le numéro de version dans le manifeste de votre programme C #.

L’explication la plus probable est que vous avez créé un assemblage C ++ / CLI. De nombreux programmeurs confondent C ++ / CLI avec C ++. Erreur facile puisque ce langage permet d’utiliser du code C ++ natif. Mais il est en fait compilé dans un assembly en mode mixte , un assembly contenant à la fois le code IL et le code natif. La vérification de la version CLR normale se produit pour un tel assemblage lorsque le CLR le charge, il ne fait que le contenter d’une correspondance de version exacte. Une contre-mesure forte de l’enfer de la DLL.

De plus, l’option de correspondance de version CLR normale est disponible pour contourner cette vérification, un élément dans votre fichier app.exe.config. En plus de contrôler le numéro de version de l’assemblage de la façon dont vous le faites pour votre code C #, cela n’est pas nécessaire.

Le moyen le plus simple de vérifier si cette estimation est exacte est d’utiliser Projet + Ajouter une référence et sélectionnez la DLL. Si cela ne soulève aucune plainte et que l’assemblage est ajouté au nœud Références de votre projet C #, vous savez alors qu’il s’agit d’un assemblage .NET normal. N’oubliez pas de profiter de cela, aucun pinvoke requirejs.

Chargez la DLL au moment de l’exécution et utilisez la reflection pour appeler ses méthodes.

 Assembly assembly = Assembly.LoadFrom("C:\\test.dll"); Assembly.GetTypes(); Activator.CreateInstance(type); 

Je ne pense pas qu’il soit possible de configurer votre programme pour utiliser la version 1.2. * Et aucune autre. Sauf si vous écrivez le code pour cela vous-même. Une autre possibilité serait de ne pas modifier la balise de version de la dll C ++, mais il ne semble pas que vous souhaitiez cela.

Une solution évitant la dépendance à la version serait l’utilisation de dllimport. Vous pouvez y charger n’importe quelle dll écrite en C ++. Il est libre de dépendance à la version. Voir l’exemple du msdn et le lien à la fin:

 using System; using System.Runtime.InteropServices; class Example { // Use DllImport to import the Win32 MessageBox function. [DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern int MessageBox(IntPtr hWnd, Ssortingng text, Ssortingng caption, uint type); static void Main() { // Call the MessageBox function using platform invoke. MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0); } 

}

Description dans MSDN