请问,用人知道怎么用C++调用C#写的dll的吗?

解决方案 »

  1.   

    VC ++.Net?
    都是托管代码的话可以.
    如果是C++ Win32程序, 可能会调用不了.
    因为一个是COM, 一个是COM+
      

  2.   

    如果用COM,VC6是可以调用C#开发的组件的。我用过,呵呵:)
      

  3.   

    你查下MSDN "注册为Com组件"
      

  4.   

    不过环境还是需要.netframework的支持
      

  5.   

    Example
    This example consists of two files: A C# file, CSharpServer.cs, that creates the CSharpServer.dll file. The .dll is used to create the file CSharpServer.tlb. 
    A C++ file, COMClient.cpp, that creates the executable client, COMClient.exe. 
    File 1: CSharpServer.cs
    // CSharpServer.cs
    // compile with: /target:library
    // post-build command: regasm CSharpServer.dll /tlb:CSharpServer.tlbusing System;
    using System.Runtime.InteropServices;
    namespace CSharpServer
    {
       // Since the .NET Framework interface and coclass have to behave as 
       // COM objects, we have to give them guids.
       [Guid("DBE0E8C4-1C61-41f3-B6A4-4E2F353D3D05")]
       public interface IManagedInterface
       {
          int PrintHi(string name);
       }   [Guid("C6659361-1625-4746-931C-36014B146679")]
       public class InterfaceImplementation : IManagedInterface
       {
          public int PrintHi(string name)
          {
             Console.WriteLine("Hello, {0}!", name);
             return 33;
          }
       }
    }
    File 2: COMClient.cpp
    // COMClient.cpp
    // Build with "cl COMClient.cpp"
    // arguments: friend#include <windows.h>
    #include <stdio.h>#pragma warning (disable: 4278)// To use managed-code servers like the C# server, 
    // we have to import the common language runtime:
    #import <mscorlib.tlb> raw_interfaces_only// For simplicity, we ignore the server namespace and use named guids:
    #if defined (USINGPROJECTSYSTEM)
    #import "..\RegisterCSharpServerAndExportTLB\CSharpServer.tlb" no_namespace named_guids
    #else  // Compiling from the command line, all files in the same directory
    #import "CSharpServer.tlb" no_namespace named_guids
    #endif
    int main(int argc, char* argv[])
    {
       IManagedInterface *cpi = NULL;
       int retval = 1;   // Initialize COM and create an instance of the InterfaceImplementation class:
       CoInitialize(NULL);
       HRESULT hr = CoCreateInstance(CLSID_InterfaceImplementation,
                   NULL, CLSCTX_INPROC_SERVER,
                   IID_IManagedInterface, reinterpret_cast<void**>(&cpi));   if (FAILED(hr))
       {
          printf("Couldn't create the instance!... 0x%x\n", hr);
       }
       else
       {
          if (argc > 1)
          {
             printf("Calling function.\n");
             fflush(stdout);
             // The variable cpi now holds an interface pointer 
             // to the managed interface.
             // If you are on an OS that uses ASCII characters at the 
             // command prompt, notice that the ASCII characters are 
             // automatically marshaled to Unicode for the C# code.
             if (cpi->PrintHi(argv[1]) == 33)
                retval = 0;
             printf("Returned from function.\n");
          }
          else
             printf ("Usage:  COMClient <name>\n");
          cpi->Release();
          cpi = NULL;
       }   // Be a good citizen and clean up COM:
       CoUninitialize();
       return retval;
    }
      

  6.   

    Output
    The executable client can be invoked with the command line: COMClient <name>, where <name> is any string you want to use, for example, COMClient friend.Calling function.
    Hello, friend!
    Returned from function.
    In the sample IDE project, set the Command Line Arguments property in the project's Property Pages to the desired string (for example, "friend").