2011-05-31 9 views
5

से बाहर निकलने के लिए ऐप का कारण बनता है मुझे बहुत संदेह है कि मेरी समस्या कुछ सुरक्षा समस्या के कारण है, लेकिन अगर मैं गलत हूं तो यहां पूरा विवरण दिया गया है।एएसपी.NET DllImport

मेरे पास एक डीएलएल है जो मूल रूप से सी (सी ++ नहीं) में लिखा गया था। मैं इस पुस्तकालय में विधियों को कॉल करने के लिए DllImport का उपयोग कर रहा हूं।

[DllImport(@"MyAntiquatedLibrary.dll") 
[SecurityPermission(SecurityAction.Assert, Unrestricted = true)] 
internal static extern void GetConnectionString(string port, string server, string instance, [Out] StringBuilder output); 

हेडर फाइल में सी घोषणा इस तरह दिखता है:

void GetConnectionString(const char far *Portname, const char far *ServerName const char far *InstanceName, char far *retConnectionName); 

तो मैं दृश्य स्टूडियो जिसका कोड-पीछे दिखता में मेरा WebApplication परियोजना में एक नमूना पृष्ठ बनाई गई घोषणा कुछ इस तरह दिखता इस तरह:

protected void Page_Load(object sender, EventArgs e) 
{ 
    try 
    { 
    var connectionString = new StringBuilder(); 
    GetConnectionString(null, "myHost", "myInstance", connectionString); 
    MyLabel.Text = connectionString.ToString(); 
    } 
    catch(Exception ex) 
    { 
    MyLabel.Text = string.Format("Something went wrong: {0}", ex.Message); 
    } 
} 

जब मैं कार्यक्रम डिबग और पिछले GetConnectionString() विधि कॉल कदम मैं एक मिलता है:

AccessViolationException was unhandled. 
Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 

मुझे एक वेब सेवा या वेबपेजेशन प्रोजेक्ट में वेबपेज से इंटरऑप डीएलएल में किए गए किसी भी कॉल के साथ एक ही समस्या दिखाई देती है। कॉल का एक ही अनुक्रम एक कंसोल अनुप्रयोग में ठीक काम करता है जिसे मैंने परीक्षण करते समय लिखा था।

एक ही कोड WindowsConsole ऐप से कॉल करते समय ठीक काम करता है। उदाहरण वास्तविक उपयोग से थोड़ा सा सरल है, लेकिन परिणाम समान हैं। असली समाधान में मेरे पास एक प्रोजेक्ट है जो सी-एपीआई के साथ इंटरैक्शन को प्रबंधित करने का प्रभारी है और यही मेरा वेब सेवा कॉल कर रहा है, लेकिन मैंने ऊपर दिया गया उदाहरण चलाया है और मैंने जो व्यवहार समझाया है उसे प्राप्त करें।

+0

आपके फ़ंक्शन – rerun

+0

@rerun की सी घोषणा क्या है: मैंने पूर्णता के लिए यह प्रश्न संपादित करने के लिए संपादित किया है, लेकिन मेरी धारणा (और यह गलत हो सकती है) यह है कि इंटरऑप कॉल ठीक काम कर रहा है जब यह सफल होता है एक कमांड लाइन परियोजना से चल रहा है। –

+1

क्या आपका आईआईएस सर्वर 64-बिट्स ओएस में चल रहा है? क्या आपका डीएल 32 बिट्स है? – yms

उत्तर

1

मुद्दा यह हुआ कि मैं सी-एपीआई को सही ढंग से शुरू नहीं कर रहा था। एक फंक्शन कॉल है जो पूरे एपीआई को शुरू करता है और जब मैं अपने यूनिटटेस्ट में ऐसा कर रहा था, तो मैं इसे webservice में करना भूल गया।

हालांकि आपकी मदद के लिए धन्यवाद, मुझे लगता है कि मैंने एएसपी.NET सुरक्षा मॉडल और .NET ट्रस्ट कार्यान्वयन के बारे में बहुत कुछ सीखा है।

1

यदि आपका आईआईएस सर्वर 64-बिट्स ओएस में चल रहा है, तो आपको स्पष्ट रूप से लक्ष्य CPU = X86 के साथ प्रोजेक्ट बनाना चाहिए, अन्यथा इसे किसी भीCPCPU के रूप में माना जाएगा और जिट इसके लिए 64 बिट देशी कोड उत्पन्न करेगा। ऐसा करने के बाद आप आईआईएस में 32 बिट एप्लिकेशन सक्षम कर सकते हैं और आपकी परियोजना को काम करना चाहिए। कुछ और जांचने के लिए यह है कि आपका डीएल वास्तव में आपके एएसपीनेट एप्लिकेशन द्वारा पाया जा रहा है।