2013-07-15 21 views
0

我在將一個C#DLL導入到另一個簡單的測試應用程序(控制檯,winform,你的名字)很困難。在c中導入一個DLL的問題#

基本上,它包括在消耗歐洲共同體增值稅檢查服務(URL我相信是Vat webservice一個巨大的圖書館。

的服務讓你下載一個圖書館,那麼代碼的執行是由你。

我也開始在Visual Studio 2010中新的C#類庫,然後添加this class它會自動從Web服務下載供自己使用,然後寫了這個片斷我在網上發現了什麼。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 
using System.Xml; 
using System.IO; 


namespace EuroVAT 
{ 
    public class EuroVAT 
    { 
     public static Array check(string country, string vatNum) 
     { 
      bool valid; 
      string name; 
      string address; 
      checkVatService vatchecker = new checkVatService(); 
      vatchecker.checkVat(ref country, ref vatNum, out valid, out name, out address); 

      return new object[] {country, 
           vatNum, 
           valid, 
           name, 
           address 
           }; 
     } 
    } 
} 

那麼,當我創建一個新的控制檯應用程序,然後添加一個引用(右鍵點擊項目名稱,添加引用,瀏覽到DLL)我的DLL編譯從一個類庫項目,其中包括我鏈接/引用2類這裏。

下面是一些代碼,我試圖用我的DLL:

using EuroVAT; 

namespace DLLTEST 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      EuroVat test = new EuroVat(); 


     } 
    } 
} 

基本上我不能夠從程序調用它們。我得到的,當我嘗試打電話EuroVAT對象是

錯誤1類型或命名空間名稱「EuroVAT」找不到(被 你缺少using指令或程序集引用?)

我試圖建立,關閉,重新打開項目。試圖把它放在Winforms等無濟於事。 我總是得到那個錯誤。

我在做什麼錯? 我能做些什麼來解決它?

還有一個問題:

這段代碼究竟做了什麼?

return new object[] {country, 
         vatNum, 
         valid, 
         name, 
         address 
         }; 

這就像返回一個對象數組? 因爲當我運行程序時,所有的輸出都拋出所有輸出。通常我不得不循環throught帶有某種迴路的輸出...

最後一個問題,如果有人能夠幫助:

我必須包括在SQL服務器這個DLL(2008年,我認爲)

我已閱讀有關主題,並發現爲了從C#dll將值傳遞給SQL Server,您必須包含各種庫並將您的方法聲明爲SqlProcedures,還要將值傳遞/檢索爲SqlTypes(SqlInt32,SqlString等等等)。

這就是我想出了:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 
using System.Xml; 
using System.IO; 
using System.Data; 
using System.Data.SqlClient; 
using System.Data.SqlTypes; 
using Microsoft.SqlServer.Server; 

namespace WebServiceVatEuropa 
{ 
    class Program 
    { 
     [SqlProcedure] 
     public static Array check(string country, string vatNum) 
     { 
      bool valid; 
      string name; 
      string address; 
      checkVatService vatchecker = new checkVatService(); 
      vatchecker.checkVat(ref country, ref vatNum, out valid, out name, out address); 

      return new object[] {country, 
           vatNum, 
           valid, 
           name, 
           address 
           }; 
     } 
    } 
} 

我希望它是正確的。 我缺少的是如何將所有這些對象轉換爲像SqlInt32,SqlString等SqlTypes。我嘗試過,但我收到了大量的轉換錯誤和類似的東西。它只是不允許我將這些對象聲明爲SqlTypes,並且我無法制作出最後一個返回語句來輸出這些SqlTypes。

任何人都可以顯示一個例子,如果可能的話?

謝謝大家。

回答

2
  1. 你的班級被宣佈爲EuroVAT。而初始化類型爲EuroVat的對象。檢查寄存器 另一件事是,儘量讓你的命名空間和類不同的名字

  2. 此: 

    return new object[] {country, 
            vatNum, 
            valid, 
            name, 
            address 
    }; 
    

    創建object類型的數組,並與(object)country填充它,(object)vatNum(object)valid

  3. 如果我正確地理解了如何讓你的庫與SQL Server交互,問題出在這個數組上。那些SQL類型,如SqlInt32,SqlString,SqlBinary等確實有相應類型的隱式轉換運算符,如int,string。但由於數組保存了object實例,所以無法應用隱式轉換。這是一方面。另一方面,SQL Server得到結果object[],它不能處理它。它不知道如何。我認爲你應該考慮使用數據訪問框架來處理數據庫,比如普通的ADO.NET或者Entity Framework,或者其他什麼。我實際上無法弄清楚你提供的這些存儲過程的意圖。

編輯:

嘗試結果傳遞到SQL Server通過SqlContext這樣的:

[SqlProcedure] 
public static void UserService(string country, stringvatNum)  
{  
    object[] serverResponse = CheckService(country, vatNum); 

    // Variables.  
    SqlMetaData column1Info;   
    SqlDataRecord record; 

    // Create the column metadata.  
    column1Info = new 
    SqlMetaData("Column1", SqlDbType.Variant);  

    // Create a new record with the column metadata.  
    record = new SqlDataRecord(new SqlMetaData[]{column1Info}); 

    // Mark the begining of the result-set. 
    SqlContext.Pipe.SendResultsStart(record); 

    foreach (var o in serverResponse)  
    { 
     record.SetValue(0, o); 
     SqlContext.Pipe.SendResultsRow(record);   
    }  

    // Mark the end of the result-set.   
    SqlContext.Pipe.SendResultsEnd(); 
} 

public static object[] CheckService(string country, string vatNum) 
{ 
    bool valid;   
    string name;  
    string address;   
    checkVatService 
    vatchecker = new checkVatService();  
    vatchecker.checkVat(ref country, ref vatNum, out valid, out name, out address); 

    return new object[] {country, 
          vatNum, 
          valid, 
          name, 
          address 
         }; 
    } 
} 
+0

謝謝您的回答。那麼我設法使用DLL,但它不是大寫/小寫問題,而是一個編譯問題。解決了。 關於對象數組,我想我有正確的直覺。謝謝。 您給我的SqlTypes提示仍然有點模糊,所以我會等待將您的答案標記爲已解決,因爲我希望看到有關此特定主題的其他人的觀點。 非常感謝您的幫助。 –

+0

編輯: 我想我找到了一種方法做的SQLType轉換做這樣的: 返回新對象[] {(的SqlString)國家, (的SqlString)vatNum, (SqlBoolean)有效, (的SqlString)名稱, (SqlString)address }; 但我沒有測試它。 –

+0

我的問題是'check()'方法不能有void或int以外的返回類型。 [鏈接](http://msdn.microsoft.com/en-us/library/ms131094.aspx) – Tommy