15. november 2006 - 15:10Der er
8 kommentarer og 1 løsning
Kalde managed C++ kode fra en dll i C#
Hejsa
Jeg har lavet en C++ managed dll, som jeg nu gerne vil bruge i C#. Jeg bruger VS2005 til dette. Jeg tilføjer min dll som reference i projektet og kan så nu bruge de klasser, der er defineret i dll'en. Og det kompilerer fint. Men når jeg vil køre mit program får jeg følgende fejl:
FileNotFoundException The specified module could not be found. (Exception from HRESULT: 0x8007007E)
Jeg går ud fra, at det skyldes, at den ikke kan finde mit modul (dll'en).
Jeg har kopieret min dll ind i et lib bibliotek i C# projektet, og så refereret den derfra. Hvad skal jeg gøre for at programmet kan benytte dll'en på kørselstidspunktet?
Jeg fandt en artikel på nettet, hvor der stod at jeg kunne prøve at registrere dll'en med regsvr32, men når jeg forsøget dette får jeg "module not found" selvom sti/filnavn er angivet helt korrekt. Kan det have noget med det at gøre og i givet fald hvad?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Du kan ikke bare bruge en manged c++ klasse i et c# projekt. I sin tid fandt jeg følgende forklaring:
What is known as a class in standard C++ is known as a __nogc class in Managed Extensions. (Managed Extensions is C++ with the CLR option.) Managed Extensions supports two kinds of classes: __nogc classes and __gc classes. You can only use __gc classes in a C# project.
You'll have to read up on Managed Extensions in the MSDN Library. The documentation explains how you can create __gc classes based on your existing __nogc classes.
Min C++ klasse er en __gc klasse. Men det virker da som om, at det er dll'en den ikke kan finde. Koden er meget simpel. C# klassens Main opretter et object fra C++ klassen vha. en tom constructor (ingen parametre/body). Burde koden fra dll'en blive kompileret ind den eksekver bare fil, eller skal den være tilgængelig på kørselstidspunktet og i givet fald hvordan (samme bib. sys32 bib e.l.)? Synes jeg har prøvet alt... Kan dll'en være kompileret forkert? Jeg kan jo fint bruge den som reference... Eller er der indstillinger i C# projektet, jeg skal være opmærksom på?
DLL'et bliver ikke kompileret ind i en exe, den ligger typisk i samme bibliotek som exefilen. Det er derfor man kalder dem dynamic link library, fordi man runtime loader koden fra dll'et ind i exe filen. Når du tilføjer et dll som reference kopiere visual studio dit dll nede i debug/release folder. Tjek lige at din dll ligger sammen med exe filen.
jo - man kan bare bruge en managed C++ klasse i C# - det er unmanaged der giver problemer
eksempel:
C:\>type testcs.cs using System;
namespace E { public class TestCS { public void Test() { Console.WriteLine("Hello - I am C#"); } } }
C:\>type testcpp.cpp #using <mscorlib.dll>
using namespace System;
namespace E { public ref class TestCPP { public: void Test() { Console::WriteLine("Hello - I am C++"); } }; }
C:\>type test.cs using System;
namespace E { public class Test { public static void Main(string[] args) { TestCS cs = new TestCS(); cs.Test(); TestCPP cpp = new TestCPP(); cpp.Test(); } } }
C:\>csc /t:library testcs.cs Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.42 for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727 Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.
C:\>cl /clr:pure /LD testcpp.cpp Microsoft (R) C/C++ Optimizing Compiler Version 14.00.50727.42 for Microsoft (R) .NET Framework version 2.00.50727.42 Copyright (C) Microsoft Corporation. All rights reserved.
testcpp.cpp Microsoft (R) Incremental Linker Version 8.00.50727.42 Copyright (C) Microsoft Corporation. All rights reserved.
C:\>csc /r:testcs.dll /r:testcpp.dll test.cs Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.42 for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727 Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.
namespace E { public class TestCS { public void Test() { Console.WriteLine("Hello - I am C#"); } } }
C:\>type testcpp.cpp #using <mscorlib.dll>
using namespace System;
namespace E { //public ref class TestCPP public __gc class TestCPP { public: void Test() { Console::WriteLine("Hello - I am C++"); } }; }
C:\>type test.cs using System;
namespace E { public class Test { public static void Main(string[] args) { TestCS cs = new TestCS(); cs.Test(); TestCPP cpp = new TestCPP(); cpp.Test(); } } }
C:\>csc /t:library testcs.cs Microsoft (R) Visual C# .NET Compiler version 7.10.6001.4 for Microsoft (R) .NET Framework version 1.1.4322 Copyright (C) Microsoft Corporation 2001-2002. All rights reserved.
C:\>rem cl /clr:pure /LD testcpp.cpp
C:\>cl /clr /LD testcpp.cpp Microsoft (R) C/C++ Optimizing Compiler Version 13.10.3052 for .NET Framework Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
testcpp.cpp Microsoft (R) Incremental Linker Version 7.10.3052 Copyright (C) Microsoft Corporation. All rights reserved.
/out:testcpp.dll /dll /implib:testcpp.lib testcpp.obj LINK : warning LNK4243: DLL containing objects compiled with /clr is not linked with /NOENTRY; image may not run correctly
C:\>csc /r:testcs.dll /r:testcpp.dll test.cs Microsoft (R) Visual C# .NET Compiler version 7.10.6001.4 for Microsoft (R) .NET Framework version 1.1.4322 Copyright (C) Microsoft Corporation 2001-2002. All rights reserved.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.