Forum: PC-Programmierung Exception beim laden der DLL


von DanielBerlin (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

Entwicklungsumgeben: Visual Studio 2015 prof
Programmiersprache: C++

Problembeschreibung:
Migrieren von alten projekt (Visual Studio 2008 "c++") zu Visual Studio 
2015 " c++".

Beim migrieren des Projekts lauft fast alles Okay, wenn es auch das .exe 
File gestartet wird.

Beim .exe File starten bekomme ich folgende Fehlermeldung "Seh bitte 
Anhang"


Meine Frage an euch: Habt ihr Erfahrungen damit?
Was muss man einstellen um so eine Problem umzugehen?

Danke in voraus

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das ist kein C++, sondern die .Net-Perversion "Managed C++" bzw. 
"C++/CLI".

Die Meldung lässt mich vermuten, daß Du versuchst, eine für .Net 2.x 
erzeugte DLL zu laden, während Dein Programm aber .Net 4.x verwendet.

Sofern Du die DLL selbst als Quelltext hast, könntest Du versuchen, sie 
ebenfalls auf den neueren Compiler und damit die .Net 4.x umzuziehen.

Ansonsten müsstest Du nach Problemen beim Mischen verschiedener 
.Net-Versionen suchen; ich kann Dir da nicht weiterhelfen, da ich aus 
verschiedenen Gründen die Finger vom .Net-Geraffel lasse.

von DanielBerlin (Gast)


Lesenswert?

Hi,

Danke für die Antwort.

Mir ist schon klar, dass es um eine Mischung von .Net Framwork sich 
handelt und wie du geschrieben hast handelt es sich nicht um eine C++.

Problem ist: Ich habe es nur dieses DLL keine Source Code sonst hätte 
ich das neue mit dem entsprechenden .NET Framwork erstellt.


Die Frage ist: Wie gehe ich mit solchen DLL um ?

Danke

von Peter Pan (Gast)


Lesenswert?

DanielBerlin schrieb:
> Die Frage ist: Wie gehe ich mit solchen DLL um ?

Probiere mal, deine App.config zu ändern (falls nicht vorhanden, 
erzeugen: Projekt-Kontextmenü -> Add -> New Item -> Application 
Configuration File - oder wie auch immer in der deutschen Version):

1
<?xml version="1.0" encoding="utf-8" ?>
2
<configuration>
3
  <startup useLegacyV2RuntimeActivationPolicy="true">
4
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
5
  </startup>
6
  <runtime>
7
    <NetFx40_LegacySecurityPolicy enabled="true"/>
8
  </runtime>
9
</configuration>

Letztlich muss sich nach dem Buildprozess eine Config-Datei mit dem 
richtigen Namen (<deineanwendung>.exe.config) und diesem Inhalt im 
Verzeichnis deiner Anwendung befinden.
Man kann die Datei (...exe.config) natürlich auch direkt von Hand in 
einem Editor erzeugen - z.B., wenn man nur ein Programm zum Laufen 
bekommen will (*) und den Quellcode nicht hat.

(*) Beispiel:
Beitrag "Re: .NetFramework 3.5"

BTW: C++/CLI ist eigentlich nicht zur Erstellung von "kompletten" 
Anwendungen gedacht, sondern als Schnittstelle zwischen .NET und Win32. 
Es gibt auch schon lange kein Template mehr für C++-GUI-Anwendungen in 
VS.

von DanielBerlin (Gast)


Lesenswert?

Hi Zusammen,

@Peter
1)Ich glaube die App.conf ist was c# spezifisch und ich weiss es nicht 
wie ich das in C++ erstellen kann.
2)Ich habe es auch in dem Projekt wo dieses Dll benutzt das ".vcxproj" 
Datei um <TargetFrameworkVersion>v2.0</TargetFrameworkVersion> 
erweitert.
Grund dafür: Die verwendete DLL ist mit dem 2.0 Version .NET Frawork 
erstellt wurde.

Diese Änderung hatte auch nicht gebracht: Ich bekomme immer die gleiche 
Fehlermeldung "seh Anhang"

Ich habe denn einen andere Weg genommen :
Ich habe einen Dummy Console Application erstellt und einfach der Dll 
aufgerufen:
Hier einen Code Abschnitt:
1
#using "HID Class.dll"
2
3
#include "stdafx.h"
4
5
int main()
6
{
7
  HIDClass::MCHPHIDClass::HIDClassVersion();
8
    return 0;
9
}
Build ist Okay
Sobald ich die exe file aufrufe kommt immer zu den gleichen Fehler "Seh 
Anhang"

Mir fehlen eifach die Lösungsansätze

von DanielBerlin (Gast)


Lesenswert?

Was ich noch vergessen habe:
Das Projekt lauft unter Visual Studio 2008 "C++" einwandfrei.
Beim Visual Studio 2015 scheint es Probleme zu haben.

von DanielBerlin (Gast)



Lesenswert?

Hallo Zusammen,


ich bekomme folgende Fehlermeldung, wenn die Application (.exe) 
gestartet wird.


Von dieses HID Class.dll habe ich leider keine Source Code sonst hätte 
ich ihm neue erstellt.


Sagt es euch dieses Fehlermeldung was?

von Peter Pan (Gast)


Angehängte Dateien:

Lesenswert?

DanielBerlin schrieb:
> Sagt es euch dieses Fehlermeldung was?

Ja, du verwendest eine .NET 2.0-DLL in einem, .NET 4-Programm.

> Ich glaube die App.conf ist was c# spezifisch und ich weiss es nicht
> wie ich das in C++ erstellen kann.

Ja, stimmt, da lag ich falsch (mache nicht viel mit C++/CLI). Das müsste 
man "von Hand" in den Build-Prozess einbinden; in C# geht das quasi 
automatisch.

Was passiert, wenn du die angehängte Datei in den Ordner deine Anwendung 
kopierst, umbenennst (-> "name" in Name der exe, also bei "foo.exe" 
müsste die Datei "foo.exe.config" heißen) und dein Programm dort 
startest?

von Peter Pan (Gast)


Lesenswert?

"in den Ordner deine/r/ Anwendung" (also Release bzw. Debug).

von PIC benutzer (Gast)


Lesenswert?

Hi Peter,



1000000000000000000000 Danke
Es funktioniert :-).

Kannst du bitte einbisschen erläutern was macht diese Config Datei?
In C++ muss diese config datei immer manuel eingefügt werden?

von Peter Pan (Gast)


Angehängte Dateien:

Lesenswert?

PIC benutzer schrieb im Beitrag #4803122:
> Kannst du bitte einbisschen erläutern was macht diese Config Datei?

Hier gibt es eine längliche Erkärung:

https://minibrain.files.wordpress.com/2012/09/marklio-what-is-uselegacyv2runtimeactivationpolicy-for_.pdf

> In C++ muss diese config datei immer manuel eingefügt werden?

Du kannst auch per Post-Build-Event (oder Pre-Build oder Pre-Link, das 
ist in diesem Fall egal) kopieren.

Dazu die Datei aus meinem vorigen Beitrag in deinen Projektordner 
kopieren (wo dein Quellcode liegt) und in "App.config" umbenennen.
Dann in den Projekteigenschaften unter Build Events -> Post-Build Event 
das hier als neues Kommando einfügen:

copy $(ProjectDir)App.config $(TargetDir)$(TargetFileName).config /Y

Achte darauf, dass dabei im Projekt-Dialog (nicht im VS-Hauptfenster) 
oben links "All Configurations"/"Alle Konfigurationen" gewählt ist, 
sonst stellt du irgendwann auf "Release" (oder umgekehrt auf Debug oder 
eine andere Konfiguration) um und es funktioniert nicht mehr.

Das Kommando kopiert die App.config in jeder Konfiguration ins 
Verzeichnis der exe und benennt sie automatisch korrekt.

von DanielBerlin (Gast)


Lesenswert?

Peter Pan schrieb:
> copy $(ProjectDir)App.config $(TargetDir)$(TargetFileName).config /Y

Ich danke dir nochmal für die ausführliche Antwort.

Nur zu ergänzen:
beim C++ in Projekteigenschaften ist die folgende Ergänzung nötig:
copy "$(ProjectDir)$(TargetFileName).config " 
"$(TargetDir)$(TargetFileName).config "
Syntaktisch muss so geschrieben werden sonst bekommt man komische Error.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die beiden Leerzeichen zwischen .config und den folgenden 
Anführungszeichen solltest Du besser weglassen.

von guest (Gast)


Lesenswert?

Peter Pan schrieb:
> Du kannst auch per Post-Build-Event (oder Pre-Build oder Pre-Link, das
> ist in diesem Fall egal) kopieren.

Alternative: Die Datei direkt zum Projekt hinzufügen und in den 
Properties der Datei (nicht des Projektes) den Typ auf 'Custom Build' 
stellen. Dann kann man den copy Befehl auch da eingeben

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.