zoukankan      html  css  js  c++  java
  • Sample: Mixing Unmanaged C++, C++/CLI, and C# code

    From: Sample: Mixing Unmanaged C++, C++/CLI, and C# code

    We have this simple unmanaged C++ class UnmanagedFoo:

    E:\sample\vc\mixed>more ufoo.h
    #include <stdio.h>
    class UnmanagedFoo
    {
    public:
        UnmanagedFoo() {printf("Constructing UnmanagedFoo\n");}
        ~UnmanagedFoo() {printf("Destructing UnmanagedFoo\n");}
       void ShowYourself();
    };

    And implementation:

    E:\sample\vc\mixed>more ufoo.cpp
    #include "ufoo.h"
    void UnmanagedFoo::ShowYourself()
    {
        printf("UnmanagedFoo\n");
    }

    Another simple C++/CLI class ManagedFoo, with a member of UnmanagedFoo.

    E:\sample\vc\mixed>more mfoo.cpp
    #include "ufoo.h"
    #using <mscorlib.dll>
    using namespace System;

    ref class ManagedFoo
    {
    public:
        ManagedFoo()
        {
            Console::WriteLine("Constructing ManagedFoo");
            m_foo = new UnmanagedFoo();
            if (!m_foo) {
                throw gcnew OutOfMemoryException();
            }
        }
        ~ManagedFoo() {ShowDestruction();}
        !ManagedFoo() {ShowDestruction();}
        void ShowYourself()
        {
            Console::WriteLine("ManagedFoo");
            m_foo->ShowYourself();
        }
    private:
        void ShowDestruction()
        {
            if (m_foo) {
                delete m_foo;
            }

            Console::WriteLine("Destructing ManagedFoo");
        }
        UnmanagedFoo *m_foo;
    };

    C# class Bar uses ManagedFoo:

    E:\sample\vc\mixed>more bar.cs
    using System;
    class Bar
    {
        public static void Main()
        {
            ManagedFoo foo = new ManagedFoo();
            foo.ShowYourself();
        }
    }

    Let us build the project.

    First, compile ufoo.cpp into (unmanaged) obj file.

    E:\sample\vc\mixed>cl.exe /Zi /MD /c ufoo.cpp
    Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
    Copyright (C) Microsoft Corporation. All rights reserved.

    ufoo.cpp

    And mfoo.cpp

    E:\sample\vc\mixed>cl.exe /Zi /clr /c mfoo.cpp
    Microsoft (R) C/C++ Optimizing Compiler Version 14.00.50727.42
    for Microsoft (R) .NET Framework version 2.00.50727.88
    Copyright (C) Microsoft Corporation. All rights reserved.

    mfoo.cpp

    And bar.cs, referencing mfoo.obj

    E:\sample\vc\mixed>csc /target:module /addmodule:mfoo.obj bar.cs
    Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.88
    for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
    Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.

    Finally, let’s link everything together.

    E:\sample\vc\mixed>link mfoo.obj ufoo.obj bar.netmodule /entry:Bar.Main /out:test.exe /subsystem:console /ltcg
    Microsoft (R) Incremental Linker Version 8.00.50727.42
    Copyright (C) Microsoft Corporation. All rights reserved.

    Generating code
    Finished generating code

    Now we have a single file assembly test.exe, mixed with unmanaged C++, C++/CLI, and C#.

    E:\sample\vc\mixed>test
    Constructing ManagedFoo
    Constructing UnmanagedFoo
    ManagedFoo
    UnmanagedFoo
    Destructing UnmanagedFoo
    Destructing ManagedFoo

    We can also put ufoo.obj into a lib and link the lib in the final step, instead of using ufoo.obj directly.

    E:\sample\vc\mixed>lib ufoo.obj /out:ufoo.lib
    Microsoft (R) Library Manager Version 8.00.50727.42
    Copyright (C) Microsoft Corporation. All rights reserved.

    E:\sample\vc\mixed>link mfoo.obj ufoo.lib bar.netmodule /entry:Bar.Main /out:test2.exe /subsystem:console /ltcg
    Microsoft (R) Incremental Linker Version 8.00.50727.42
    Copyright (C) Microsoft Corporation. All rights reserved.

    Generating code
    Finished generating code

    E:\sample\vc\mixed>test2
    Constructing ManagedFoo
    Constructing UnmanagedFoo
    ManagedFoo
    UnmanagedFoo
    Destructing UnmanagedFoo
    Destructing ManagedFoo
     

  • 相关阅读:
    C++中的类模板详细讲述
    IE6
    Active Driectory 操作(转来放起来,不要丢了)
    The length of the query string for this request exceeds the configured maxQueryStringLength value
    试一下用word发布一篇文章
    各种分享api
    汇编语言程序设计 检测点1.1
    Windows下配置使用MemCached
    chrome
    ASP.NET 把集合导出为Excel的一个助手类
  • 原文地址:https://www.cnblogs.com/taoxu0903/p/1772892.html
Copyright © 2011-2022 走看看