CodefoundryDE / LegacyWrapper

LegacyWrapper uses a x86 wrapper to call legacy dlls from a 64 bit process (or vice versa).
MIT License
79 stars 20 forks source link

Dynamically define import dll #25

Open ElDuderinoBerlin opened 4 years ago

ElDuderinoBerlin commented 4 years ago

Hello,

btw. nice project! Can i define the directory of the imported dll dynamically?

Regards Martin

zalintyre commented 4 years ago

Hello Martin,

that's not possible at the moment. You have to specify the DLL path in the attribute on the interface you provide to the LegacyWrapper.

Kind Regards Franz

ElDuderinoBerlin commented 4 years ago

Hallo Franz,

ich versuche das selber. Gibt es eine Möglichkeit in WrapperClientInterceptor::Intercept(IInvocation invocation) an die WrapperConfig ranzukommen? Das Dependency-Injection verwirrt mich. Ich werde auch Assemblies unterstützen, nicht nur Natives, da ich aus Assemblies (VC++.NET) ebenfalls über Prozessgrenzen hinweg Funktionen aufrufen muss. IntPtr-to-String Marshaling habe ich schon implementiert, da Speicher nicht gemarshalt werden kann über Prozessgrenzen.

Hatte sowas: IntPtr HoleEtwas() -> string HoleEtwas() Bsp.: [LegacyDllMethod(CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] [return: ReturnMarshalAs(DefaultReturnType = typeof(IntPtr), ReturnMarshalerType = typeof(IntPtrToStringMarshaler) )] string HoleEtwas();

Gruß Martin

ElDuderinoBerlin commented 4 years ago

Habs selber geschafft! :-)

    public WrapperClientInterceptor(Type interfaceType, WrapperClient wrapperClient, ILibraryNameProvider libraryNameProvider, IWrapperConfig config)
    {
        Raise.ArgumentNullException.IfIsNull(interfaceType, nameof(interfaceType));
        Raise.ArgumentNullException.IfIsNull(wrapperClient, nameof(wrapperClient));
        Raise.ArgumentNullException.IfIsNull(libraryNameProvider, nameof(libraryNameProvider));

        _interfaceType = interfaceType;
        _wrapperClient = wrapperClient;
        _libraryNameProvider = libraryNameProvider;
        _config = config;
    }

        var configuration = WrapperConfigBuilder.Create()
            .TargetArchitecture(TargetArchitecture.X86)
            .ModuleSearchDirectory("M$:\Redmond\Bill")
            .Build();
zalintyre commented 4 years ago

Stell mir gern einen Pull Request ;)

sharpSteff commented 4 years ago

@maddinthegreat bitte PR machen :) ich brauch die funktionalität auch!

ElDuderinoBerlin commented 4 years ago

Seid beide nun Mittäter!

sharpSteff commented 4 years ago

@maddinthegreat erst wenn der PR da is :D

ElDuderinoBerlin commented 4 years ago

@sharpSteff du müsstest den Code ziehen können - bist Kollaborator.

sharpSteff commented 4 years ago

@maddinthegreat gibt es Gründe wieso dein Repo kein offizieller Fork ist ?

ElDuderinoBerlin commented 4 years ago

Wieso Fork? Hab den Code so runtergeladen und modifiziert, dann wieder hochgeladen. Entweder du nimmst das so oder lässt es bleiben!

sharpSteff commented 4 years ago

Naja du hast genau, das gleiche gemacht was ein Fork mit einem Klick gemacht hätte. Nur dass du die gesamte git History verloren hast und du über das repository keinen ssuberen Pull Request mehr auf das upstream Repo machen kannst

sharpSteff commented 4 years ago

Trotzdem danke :)

ElDuderinoBerlin commented 4 years ago

Das ist eine private Ergänzung für ein spezielles Projekt gewesen. Da will ich keine Historie, noch mergen in Zukunft oder sonstwas! Das ich Dir Stunden an Coden gespart habe (ob Du das selber geschafft hättest, kann ich nicht sagen), kannste als nachträgliches Weihnachtsgeschenk betrachten. Bitte!

PS: Ich mach eben Bilder und benutze noch Papier. Bin eben oldschool. Und manchmal drucke ich mir Code aus, um ihn zu studieren.