Avatar billede connorz Nybegynder
15. november 2006 - 15:10 Der 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?

Tak for hjælpen :)
Avatar billede arne_v Ekspert
16. november 2006 - 04:14 #1
Hvis det er en managed C++ DLL, så burde den vel opføre sig præcis ligesom en C# DLL !?!?
Avatar billede segato Nybegynder
16. november 2006 - 08:17 #2
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.
Avatar billede connorz Nybegynder
16. november 2006 - 08:54 #3
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å?
Avatar billede segato Nybegynder
16. november 2006 - 11:28 #4
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.
Avatar billede arne_v Ekspert
17. november 2006 - 04:05 #5
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.

/out:testcpp.dll
/clrimagetype:pure
/dll
/implib:testcpp.lib
testcpp.obj

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.


C:\>test
Hello - I am C#
Hello - I am C++
Avatar billede arne_v Ekspert
17. november 2006 - 04:09 #6
og med 2003:

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 __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.


C:\>test
Hello - I am C#
Hello - I am C++
Avatar billede arne_v Ekspert
10. december 2006 - 01:00 #7
connorz ?
Avatar billede connorz Nybegynder
19. december 2006 - 13:38 #8
Jeg ændrede det, så jeg bruger C++/CLI - det hjalp. Tak for jeres svar... de har været brugbare... Smid svar, hvis I vil have point
Avatar billede arne_v Ekspert
19. december 2006 - 18:56 #9
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester