Question

Je veux appeler une fonction d'une .NET DLL (codé en C#) à partir d'une Inno script d'Installation.

J'ai:

  1. a marqué le S'inscrire pour COM interop option dans les propriétés du projet,
  2. changé la ComVisible réglage de la AssemblyInfo.cs fichier,
  3. ajouté ces lignes à l'ISS script:

[Fichiers]

Source:c: emp\1\MyDLL.dll;Drapeaux:dontcopy

[Code]

function MyFunction():chaîne de caractères;

externe 'MyFunction@files:MyDLL.dll stdcall setuponly';

mais j'ai toujours le message d'erreur suivant:

Erreur d'exécution (au -1:0):

Impossible d'Importer des dll:C:\DOCUME~1\foo\LOCALS~1 emp\is-LRL3E.tmp\MyDLL.dll.

Ce que je fais mal?

Était-ce utile?

La solution

Oups, my bad, ça fait trop longtemps depuis que j'ai lu pascal!Donc, si vous avez besoin pour obtenir la valeur alors il ya un couple de possibilités:

  1. Écrire les fonctionnalités en C/C++ et l'exportation de la fonction, qui est certainement pris en charge.
  2. Utiliser une dll C++ Géré de cale pour votre .NET dll, et de les exposer à l'appel comme un C point d'interface (cela devrait fonctionner, mais il commence à faire désordre)
  3. Utiliser un .exe pour stocker le résultat de votre code dans un .Fichier INI ou dans le registre ou dans un fichier temporaire et de lire le résultat dans la configuration de la section de code (ce qui est maintenant bien méchant)

Dernière fois que j'ai travaillé avec InnoSetup il n'a pas l'appui de votre scénario directement (l'appel .NET code à partir de l'installation).

Autres conseils

Intenta de esta manera (Essayer de cette façon):

Var
 obj: Variant
 va: MyVariableType;
Begin
 //Starting
 ExtractTemporaryFile('MyDll.dll');
 RegisterServer(False, ExpandConstant('{tmp}\MyDll.dll'), False);
 obj := CreateOleObject('MyDll.MyClass');
 //Using
 va := obj.MyFunction();
 //Finishing
 UnregisterServer(False, ExpandConstant('{tmp}\MyDll.dll'), False);
 DeleteFile('{tmp}\MyDll.dll');
End;

Suerte (bonne chance)

J'ai lu un peu plus sur elle - maintenant, je peux voir la différence entre l'importation d'un style C de la fonction et de la création d'un objet OLE.

Quelque chose comme ça pourrait fonctionner pour moi:

[Code]
procedure MyFunction();
var
  oleObject: Variant;
begin
  oleObject := CreateOleObject('MyDLL.MyDLL');

  MsgBox(oleObject.MyFunction, mbInformation, mb_Ok);
end;

mais il nécessite l'enregistrement de la DLL fichier.

Je suppose que je dois créer une application de ligne de commande pour appeler les fonctions de la DLL.

Vous tentez d'importer un style C fonction de votre .NET dll - ce n'est pas vraiment rien avoir à faire avec COM interop.COM interop vous permet d'activer votre .NET des objets comme des objets COM, il n'a pas les exposer comme C/C++ des fonctions exportées/types d'.

Si votre fonction n'a pas besoin de renvoyer toutes les données, pourquoi ne pas faire un simple .exe qui appelle votre fonction et il suffit d'exécuter à partir de votre installation?

Aussi:Voir la innosetup support de groupes de discussion où vous pourriez obtenir un meilleur soutien.

L'utilisation de la Non géré les Exportations de la bibliothèque pour exporter une fonction à partir d'un C# de l'assemblée, en ce sens qu'il peut être appelé dans Inno Setup.

  • Mettre en œuvre une méthode statique dans la bibliothèque de classes C#
  • Ajouter l' Non Géré Exportations Package NuGet à votre projet
  • Ensemble Plate-forme cible de votre projet x86
  • Ajouter l' DllExport attribut à votre méthode
  • Si nécessaire, définir un regroupement pour les arguments de la fonction (en particulier le marshaling des arguments de chaîne doit être défini).
  • Construire
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;

namespace MyNetDll
{
    public class MyFunctions
    {
        [DllExport(CallingConvention = CallingConvention.StdCall)]
        public static bool RegexMatch(
            [MarshalAs(UnmanagedType.LPWStr)]string pattern,
            [MarshalAs(UnmanagedType.LPWStr)]string input)
        {
            return Regex.Match(input, pattern).Success;
        }
    }
}

Sur Inno Setup côté:

[Files]
Source: "MyNetDll.dll"; Flags: dontcopy

[Code]
function RegexMatch(Pattern: string; Input: string): Boolean;
    external 'RegexMatch@files:MyNetDll.dll stdcall';

Et maintenant vous pouvez utiliser votre fonction comme ceci:

if RegexMatch('[0-9]+', '123456789') then
begin
  Log('Matched');
end
  else
begin
  Log('Not matched');
end;

Voir aussi:

Un .NET dll peut être mieux disant de n'importe quel autre langage de programmation, l'exposition comme un objet COM.Jetez un oeil à cet exemple: http://support.microsoft.com/kb/828736.Cela montre comment appeler une ".NET dll" à partir de "C++".Vous pouvez remplacer le "unamanged C++" par n'importe quel autre langage de programmation, qui peut être utilisé comme un client COM.

Essayez d'utiliser delayload, il est utilisé pour une dll qui ne peut pas exister au moment de l'exécution.Ce résoudre le problème.

Par exemple:

[Files]
Source: odbccp32.dll; Flags: dontcopy

[Code]
procedure SQLConfigDataSource(hwndParent: Integer; Frequest: Integer; LpszDriver: String; lpszAttributes: String);
external 'SQLConfigDataSource@files:odbccp32.dll stdcall delayload';
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top