6
votes

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

Nous créons une DLL, écrit en C ++, fournissant un accès à un matériel. 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 souhaite absolument utiliser la version exacte C ++ DLL utilisée lors de la compilation. C'est à dire. Si le programme C # a été compilé à l'aide de C ++ DLL 1.2.3.4, le programme refusera de fonctionner avec C ++ DLL 1.2.3.5.

J'aimerais instruire le programme C # d'utiliser n'importe quelle DLL C ++ avec la version 1.2.Tout.

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

Cette question a été remplacée par celui-là , plus lié à com.


3 commentaires

Comment votre programme C # utilise-t-il cette DLL?


Utilisez-vous l'assemblage C ++ / CLI? Veuillez ajouter quelques détails sur la façon dont vous construisez votre doux ...


@alexbuisson La DLL n'utilise pas C ++ / CLI. La DLL est compilée à l'exécutable native.


3 Réponses :


1
votes

Chargez la DLL au moment de l'exécution et utilisez la réflexion pour appeler ses méthodes. XXX


1 commentaires

Oh d'accord. Pouvez-vous ne pas charger de manière dynamique une DLL C ++?



1
votes

Je ne pense pas qu'il soit possible de configurer votre programme pour utiliser 1.2. * Version et aucun autre. Sauf si vous écrivez le code pour cela par vous-même. Une autre possibilité ne serait pas de changer la version de version de la DLL C ++, mais il ne semble pas que vous le souhaitez.

Une solution évitant la dépendance de la version serait l'utilisation de Dllimport. Vous pouvez charger n'importe quelle DLL écrite en C ++ avec elle. Il est exempt de dépendance de la version. Voir l'exemple de MSDN et de lien à la fin: P>

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, String text, String caption, uint type);

 static void Main()
 {
     // Call the MessageBox function using platform invoke.
    MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
 }


0 commentaires

3
votes

rien de cette fantaisie existe en C ++. L'utilisation d'un manifeste côte à côte permet techniquement de cela, mais vous en auriez su car vous auriez saisi le numéro de version dans le manifeste de votre programme C #.

L'explication beaucoup plus probable est que vous avez créé une assemblée C ++ / CLI. De nombreux programmeurs confondent C ++ / CLI avec C ++. Erreur facile car cette langue permet d'utiliser un code natif c ++. Mais il est effectivement compilé à un ensemble mode mixte , un assemblage contenant à la fois un code IL et un code natif. La vérification de la version CLR normale se produit pour un tel assemblage lorsque le CLR le charge, il n'est content que d'une correspondance exacte. Une forte dll enfer contre-mesurer.

Et l'option Normal Version CLR Version Wrangling est disponible pour contourner ce chèque, un dans votre fichier app.exe.config. En plus de contrôler le numéro de version d'assemblage, la manière dont vous le faites pour votre code C #, cela n'est donc pas nécessaire.

Le moyen le plus simple de vérifier si cette hypothèse est exacte consiste à utiliser Project + Ajouter une référence et sélectionnez la DLL. Si cela ne tire aucune plainte et que l'assemblage est ajouté au nœud de références de votre projet C #, vous savez c'est un assemblage normal .NET. N'oubliez pas de profiter de cela, pas de pinvoke requis.


0 commentaires