VC里如何调用C#写的dll ???

解决方案 »

  1.   

    http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/csref/html/vcwlkcominteroppart2cservertutorial.asp
    http://topic.csdn.net/t/20051027/16/4354580.html
      

  2.   

    两个文件组成: C# 文件 CSharpServer.cs,它创建 CSharpServer.dll 文件。.dll 用于创建 CSharpServer.tlb 文件。 
    C++ 文件 COMClient.cpp,它创建可执行客户端 COMClient.exe。 
    文件 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;
          }
       }
    }
    文件 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;
    }
    输出
    可以用以下命令行调用可执行客户端:COMClient <name>,其中 <name> 表示要使用的任何字符串,如 COMClient friend。Calling function.
    Hello, friend!
    Returned from function.
    在示例 IDE 项目中,将项目“属性页”中的“命令行参数”属性设置为需要的字符串(例如,“friend”)。