Växla mellan Administration & Förening i samma applikation

  • 0
  • 1
  • Fråga
  • Uppdaterades för 7 månader sedan
  • Besvarad
  • (Redigerad)
Hjälp!

Jag har lyckats köra huvudet i väggen.

Håller på att bygga en integrations-dll för att integrera med Vismas Avtal.

Det har fungerat rätt ok (En del buggar har jag löst)

När jag sedan skulle börja testa lite hårdare inser jag att när jag växlar från ett bolag i Visma Förening till ett bolag i Visma Administration så har inte min applikation släppt ADK.dll:en.

Jag har nu lagt en vecka på att kapsla in alltihop i en Appdomain då jag trodde det skulle fungera men trotts att jag kört hela processen i en separat Appdomain och kört unload på den efteråt så är det enbart den första valda av Förening eller Administration som går att köra mot i efterföljande anrop.

Är det någon som har en tutorial som visar hur jag öppnar ett bolag i Visma förening och hämtar eller uppdaterar något. och sedan gör exakt samma sak i ett annat bolag i Visma administration från samma kodbas utan att starta om programmet mellan.



Foto på Iceman

Iceman

  • 224 poäng 100 badge 2x thumb
  • Frustrerad

Publicerades för 8 månader sedan

  • 0
  • 1
Foto på Helena Andersson

Helena Andersson, Application Specialist Administration/Tid/Autocollect/AutoInvoice

  • 8,120 poäng 5k badge 2x thumb
Hej Iceman!
Visma Administration och Visma Förening har som du säkert vet olika ADK.dll som jobbar mot programmet. För att kunna växla mellan de olika systemen måste du ansluta till rätt ADK.dll.


Kör man båda programmen på samma dator lär det inte funka att köra detta i olika processer vid statisk laddning. För att laddningen av DLL-filerna ska bli korrekt bör de laddas dynamiskt. Detta är dock inget som vi har testat eller garanterat stöd för. Hur du laddar filen dynamiskt beror på vilken fil (adknetwrapper eller adk.dll) ni laddar och vilken miljö du utvecklar ditt program i.
(Redigerad)
Foto på Iceman

Iceman

  • 224 poäng 100 badge 2x thumb
Hej Helena!

Eller om någon annan vill gnugga geniknölarna och förklara för mej var jag tänker fel.


Som ni ser i koden nedan så gör metoden Test_OpenClose 
AdkOpen - Med felkontroll
sedan gör den 
AdkClose.

Se nedan test Lägg in den i en Console application och förklara varför den kastar felet:  "Föreningen måste vara skapat med Visma Förening." 

Förutsätter:
1 - att du har både Visma Förening & Visma Administration installerade på datorn. 
2 - att du har Demobolagen kvar.

using Microsoft.Win32;
using System;
using System.IO;
using API = AdkNet4Wrapper.Api;

namespace VismaTest
{
    class Program
    {
        static void Main(string[] args)
        {
            using (Visma visma = new Visma())
            {
                visma.Test_OpenClose("SpcsFor.exe", "Idrfor");
            }

            using (Visma visma = new Visma())
            {
                visma.Test_OpenClose("SpcsAdm.exe", "Ovnbol1000");
            }
        }
    }

    public class Visma : IDisposable
    {
        const string sAppPaths = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths";

        private RegistryKey AppPathsKey
        {
            get
            {
                return Registry.LocalMachine.OpenSubKey(sAppPaths, false);
            }
        }
        private RegistryKey VismaERPKey(string _application)
        {
            return AppPathsKey.OpenSubKey(_application, false);
        }
        private string CommonFilesPath(string _application)
        {
            return VismaERPKey(_application).GetValue("CommonFiles") as String;
        }
        private string DefaultCompanyPath(string _application)
        {
            return VismaERPKey(_application).GetValue("DefaultCompanyPath") as String;
        }
        private string AdkDLLPath(string _application)
        {
            return VismaERPKey(_application).GetValue("AdkDll") as String;
        }

        private API.ADKERROR CheckADKError(API.ADKERROR _error)
        {
            if (_error.lRc != API.ADKE_OK)
            {
                String errortext = new String(' ', 200);
                int errtype = (int)API.ADK_ERROR_TEXT_TYPE.elRc;
                API.AdkGetErrorText(ref _error, errtype, ref errortext, 200);
                throw new Exception(errortext);
            }
            return _error;
        }

        public void Test_OpenClose(string _application, string _company)
        {
            string localAdkDLLPath = AdkDLLPath(_application);
            string localCommonFilesPath = CommonFilesPath(_application);
            string localCompanyPath = DefaultCompanyPath(_application) + _company;

            Directory.SetCurrentDirectory(localAdkDLLPath);
            CheckADKError(API.AdkOpen(ref localCommonFilesPath, ref localCompanyPath));
            API.AdkClose();
        }

        public void Dispose()
        {
            // throw new NotImplementedException();
        }
    }
}


(Redigerad)
Foto på Ellinor grudstrom

Ellinor grudstrom

  • 82 poäng 75 badge 2x thumb
Hej Iceman

Du verkar ha båda programmen installerade är på samma dator. Eftersom du använder AdkNetWrapper så laddas ADK.dll statiskt och då kommer den ta första ADK.dll som windows hittar. Då du har installerat Förening först och Admin sen - vi skriver till miljövariabeln Path vid installation och i ditt fall står Förenings Path först och därför kommer Förenings ADK.dll att användas vid varje anrop. Företag från Administration kommer inte kunna öppnas på grund av detta. Just nu stöder vi inte att man laddar ADK.dll på detta vis på en dator med både Förening och Administration.

Du kan teoretiskt sett i tidigt skede i C# köra LoadLibrary av rätt ADK.dll för aktuell process innan AdkNetWrapper.dll laddas per automatik och på så sätt kunna köra valt programs API i denna process, Däremot ser jag det som svårt att köra båda programmens API i samma process om man använder AdkNetWrapper.
Foto på Iceman

Iceman

  • 224 poäng 100 badge 2x thumb
Tack Ellinor!
Nu börjar det kännas som vi kommer någon vart.

Nu har jag en input att jobba mot.


/Håkan