Методы доступа из файла ATL DLL в C # - PullRequest
3 голосов
/ 23 июля 2010

Я работал над попыткой связать некоторый код на С ++ и обернуть его внутри COM-объекта для доступа через C #.Я создал проект atl и добавил простой метод, такой как Add (double a, double b).Ниже приведен код из моего файла atl.h:

// atl.h : Declaration of the Catl
#pragma once
#include "resource.h"       // main symbols

#include "com_i.h"


#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
#endif



// Catl

class ATL_NO_VTABLE Catl :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<Catl, &CLSID_atl>,
public Iatl
{
public:
Catl()
{
}

DECLARE_REGISTRY_RESOURCEID(IDR_ATL)

DECLARE_NOT_AGGREGATABLE(Catl)

BEGIN_COM_MAP(Catl)
COM_INTERFACE_ENTRY(Iatl)
END_COM_MAP()



DECLARE_PROTECT_FINAL_CONSTRUCT()

HRESULT FinalConstruct()
{
    return S_OK;
}

void FinalRelease()
{
}

public:

STDMETHOD(Add)(DOUBLE a, DOUBLE b);
};

OBJECT_ENTRY_AUTO(__uuidof(atl), Catl)

Ниже приведен код из файла atl.cpp

// atl.cpp : Implementation of Catl

#include "stdafx.h"
#include "atl.h"

STDMETHODIMP Catl::Add(DOUBLE a, DOUBLE b)
{
// TODO: Add your implementation code here

return a + b;
}

Внутри моего файла c # я вызываю DLL.... после того, как я ссылался на него ... он видит DLL, но не назначенные методы.что является моей проблемойВот код из program.cs

sing System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace sharpdll
{
class Program
{
    [DllImport("com.dll")]
    public static extern double Add(double a, double b);

    static void Main(string[] args)
    {
        Add(2, 3);
    }
}
}

Отладка прерываний при добавлении (2, 3);Говорит «Невозможно найти точку входа с именем« Добавить »в DLL« com.dll ».»Есть идеи?

1 Ответ

2 голосов
/ 23 июля 2010

DllImport предназначен для PInvoke (для собственных Win32-библиотек).
Требуется COM-взаимодействие.

Зарегистрируйте свой объект ATL com, затем добавьте ссылку на него, как если бы вы использовали любой .Net или COMcomponent.

Альтернатива ATL, вы можете раскрыть свои функциональные возможности C ++ через C ++ / CLI.

Надеюсь, это поможет,

...