Potřeboval bych načíst dll, přičemž je mi jedno, kdy se načte, jestli při sestavování programu, při jeho startu nebo při použití funkce z dll do programu v CLI C++. Hlavně aby to bylo jednoduše smiling smiley
Abych nevypadal jako úplná lama, hledal jsem na msdn, ale asi špatně. Našel jsem tam návody na linkování unmanaged knihoven, ale nic, co bych potřeboval. Mám jen dll (a zdroják v C#) a chci se dostat k jeho funkcím, resp. k jeho jmennému prostoru. Když použiju dll pomocí direktivy #using "neco.dll", začne fungovat IntelliSense a po napsání using namespace Neco; mi začne nabízet jeho prvky. Pokračuji tedy v programování, ale narazím při pokusu o sestavení - hlásí chybu nejednozančnosti jmen, že "Neco" může být i "Neco::Neco" atp. Snažím se tedy "okakat" systém a píšu úplné názvy objektů. Při dalším pokusu o sestavení mi vypíše chybu syntaxe u identifikátoru členské funkce z třídy Neco, ačkoliv nevím proč, když mi tento název nabídl sám IntelliSense.
Moje naivní představa je, že vložím na začátek #using "neco.dll" a hned můžu používat všechny jeho funkce. Jsem opravdu naivní? Pokud ne, napište mi prosím, jak se "na lopatě sedí".
Díky
Fórum › .NET
Načtení DLL v MSVC++ .NET
Tak by to taky mělo fungovat (když se jedná o assembly a ne Win32 DLL) a mělo by to bez problémů fungovat (i když u C++/CLI je asi možný všechno). Zkus přihodit zdroják.
PS: předpokládám, že máš danou knihovnu správně nareferencovanou, protože jinak by IntelliSense mlčel
Tak tohle je začátek z Form.h
#pragma once
#using "Modbus.dll"
//static Modbus::Device::ModbusSerialMaster^ Modbus::Device::ModbusSerialMaster::CreateRtu(System::IO::Ports::SerialPort ^serialPort);
namespace novy {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::Reflection;
using namespace Modbus;
using namespace Modbus::Device;
using namespace Modbus::IO;
using namespace Modbus::Util;
A tohle je obsluha kliknutí na tlačítko. V podstatě šlo jen o vyzkoušení, jak se načítá dll. Mám k tomu dll zdrojáky, ale v C#.
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
serialPort1->Open();
//ModbusSerialMaster^ master = gcnew ModbusSerialMaster::CreateRtu(serialPort1);
Modbus::Device::ModbusSerialMaster^ master = gcnew Modbus::Device::ModbusSerialMaster::CreateRtu(serialPort1);
System::Byte slaveID = 1;
unsigned short startAdress = 100;
array<unsigned short,1>^ registers = gcnew array<unsigned short,1> {1,2,3};
master->WriteMultipleRegisters(slaveID,startAdress,registers);
serialPort1->Close();
}
Tohle je příklad výpisu chyb na using namespace:
error C2872: 'Modbus' : ambiguous symbol could be 'Modbus' or 'modbus.dll : Modbus::Modbus'
A tady chyba na použití funkce z dll:
error C2061: syntax error : identifier 'CreateRtu'
No nemůžu si to ověřit v praxi, ale ambiguous znamená dvojznačný, tak zkus napsat kód takhle:
using namespace Modbus;
using namespace Modbus::Modbus::Device;
using namespace Modbus::Modbus::IO;
using namespace Modbus::Modbus::Util;
To je právě to, že Modbus::Modbus není namespace, ale class, takže to nepůjde. Když požiju jen using namespace Modbus (a upřesním funkci), zůstane mi viset jen chyba error C2061: syntax error : identifier 'CreateRtu'. Nejsem zas takový odborník, abych věděl, jaký vliv má původní jazyk na konečnou podobu dll, ale pomalu začínám mít tušení, že budu muset svou aplikaci přepsat do C#...
Použitý jazyk nemá na výsledný IL praktický žádný vliv (i když drobné odlišnosti tam jsou), takže přepisovat to do C# nebude mít velkej význam (i když by to bylo z mého pohledu snažší). Já s C++/CLI vůbec nepracuju, takže nevím čím to může bejt způsobený, ale snad bych na to přišel, kdybych to mohl u sebe zkusit. Pokud to je možný, tak mi kdyžtak pošli zdroje na mail.
No, ono toho je dost. Zkusim na tom popracovat a kdyžtak se ještě ozvu. Jiné dll se mi totiž podařilo normálně rozběhat, takže zkusím sehnat lepší verzi. Jak jsem koukal na netu, tak originál souboru modbus.dll stojí něco okolo 195 USD, tak kdo ví, jak to s tím je. Tohle jsem našel jako návod s příkladem a ačkoliv jsou zdroje (zdá se) kompletní, nejde to zkompilovat, vypisuje spoustu chyb, ale nejsem v C# doma, tak to nebudu snad ani řešit. Zatím díky za pomoc.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Štandardná DLL v MSVC++ .Net — založil Thew
.NET DLL do SilverLight projektu — založil X3
Jak přidat dll soubor do exe souboru nebo změnit umístění pro jeho n… — založil Jiri K.
Asp.net webforms nacteni z dropdownlistu — založil silent
Visual Studio GCC vs MSVC — založil Rtt
Moderátoři diskuze