2012-05-01 49 views
0

我試圖做一個基本的C++ DLL,以便在C#中使用它..下面的類用於:C++ DLL導入到C#應用程序

我的cpp文件

#include "stdafx.h"  
#include "MathFuncsAssembly.h" 

namespace MathFuncs 
{ 
    double MyMathFuncs::Add(double a, double b) 
    { 
     return a + b; 
    } 

    double MyMathFuncs::Subtract(double a, double b) 
    { 
     return a - b; 
    } 

    double MyMathFuncs::Multiply(double a, double b) 
    { 
     return a * b; 
    } 

    double MyMathFuncs::Divide(double a, double b) 
    { 
     if (b == 0) 
     { 
      throw gcnew DivideByZeroException("b cannot be zero!"); 
     } 

     return a/b; 
    } 
} 

我的頭文件

using namespace System; 

namespace MathFuncs 
{ 
    public ref class MyMathFuncs 
    { 
    public: 
     static double Add(double a, double b); 

     static double Subtract(double a, double b); 

     static double Multiply(double a, double b); 

     static double Divide(double a, double b); 
    }; 
} 

,並在我的C#應用​​程序,其中我調用庫

[DllImport("MathFuncsAssembly.dll")] 
public static extern double Add(double a, double b); 

static void Main(string[] args) 
{ 
    Console.WriteLine(Add(10.0, 11.0)); 
    Console.ReadLine(); 
} 

(Add(10.0,11.0))部件發生異常。拋出以下異常: 嘗試裝入格式不正確的程序。 (從HRESULT異常:0x8007000B)..任何想法?另外,我複製了C#應用程序的bin文件中的.dll文件...

謝謝!

+0

是DLL文件32還是64位?你的clr是32位還是64位?通常這是與您的錯誤相關的這種不兼容性。 – alegen

+2

你是這樣做的錯誤方式..如果你有一個ref類(因此也是一個C++/CLI DLL),你根本不需要DllImport:只需在C#項目中添加一個對dll的引用,然後調用函數'的C#方式'即MathFuncs.Add() – stijn

+0

@stijin ...感謝很多隊友!:)))多數民衆贊成在正確的答案:)) – user1317277

回答

1

如果你有一個ref類(因此是一個C++/CLI dll),你根本不需要DllImport:只需在C#項目中添加一個對dll的引用,並調用函數的'C#方式'即MathFuncs.Add()(注意你仍然需要確保平臺匹配,CLI dll依賴的所有本地dll都在路徑中)

+0

@ stijin ..我的應用程序由結構..我應該在哪裏定義結構?在標題或.cpp?此外,一些方法返回一個指向結構的實例的指針..我該怎麼做?因爲我不斷得到相同的錯誤..錯誤是以下內容:'錯誤錯誤C2027:使用未定義的類型' – user1317277

+0

通常你會聲明該結構與它的頭函數,並提供定義在源(cpp)。 C2027意味着你正在使用編譯器不知道的類型。最好爲這個和後面的代碼啓動一個單獨的問題,否則就不可能回答這個問題。 – stijn

0

通常情況下,當您嘗試在x64程序中使用x32 DLL或反之時,會發生這種情況。

0

「不正確格式」異常意味着您正在加載爲不同平臺編譯的模塊,即32位和64位。確保你的DLL和你的C#應用​​程序是爲同一個平臺編譯的。如果C#設置爲「任何平臺」,請明確選擇您的DLL用於的平臺。