2010-07-23 4 views
3

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

// 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, но не назначенные методы. это моя проблема. Heres код из 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 ».» Любые идеи?

ответ

2

DllImport предназначен для PInvoke (для родных DLL Win32).
Вы хотите COM Interop.

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

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

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

+0

Спасибо, бинарный волк, который привел меня в правильном направлении. Но после регистрации объекта, ссылаясь на dll, как обычно, внутри папки bin проекта, строит отлично, но когда я запускаю проект ... У меня есть следующая ошибка: Не удается загрузить DLL 'com.dll': указанный модуль не найден. (Исключение из HRESULT: 0x8007007E) Я не понимаю, почему его получение этой ошибки ... ссылка отлично работала, любые идеи? Почти готово!! – user400383

+0

Я бы хотел показать свой экран, чтобы убедиться, что все на месте, через skype, crossloop и т. Д. – user400383

+0

Угадайте, я бы сказал, что вы не строите COM-объект правильно. Это не моя область знаний. Вы должны задать другой вопрос с этой конкретной проблемой. Извините, я не могу больше помочь :) –