2012-04-02 19 views
1

.Net2.0のregasmを使用して正しく登録するDLLがありますが、.NET4.0 regasmに登録しようとすると、「ファイルを読み込めませんでしたまたはアセンブリ 'FILENAMEHERE' またはそれの一つが依存関係をの操作がサポートされていません(例外HRESULTから:。。0x8013515 コードとアセンブリされRegAsm dll .net2.0〜.net4.0

STARTelnet.cs以下

/** 
*Steven T. Norris  Created: 3/27/2012 
*Last Updated By: Steven T. Norris  Last Updated On: 3/27/2012 
* 
*/ 

using System; 
using MinimalisticTelnet; 
using System.Net.Sockets; 

/** 
* @brief Used to connect to, read, and respond to a STAR terminal session. 
* 
* Steven T. Norris  Created: 3/27/2012 
*/ 
namespace STARTelnet 
{ 
    /** 
    * Class used to connect to, read, and respond to a STAR terminal session. 
    */ 
    public class STARConnection 
    { 
     private TelnetConnection conn; 
     private string output; 
     private string command; 
     private string prompt; 

     /** 
     * Instantiates new STARConnection. <br/> 
     * Recommended login timeout is 2000. <br/> 
     * Recommended overall timeout is 500. <br/> 
     * Throws SocketException, PromptException, LoginException 
     * 
     * @param [in] string username:Username for login 
     * @param [in] string password:Password for login 
     * @param [in] int loginTimeout:timeout milliseconds for login 
     * @param [in] int overallTimeout:timeout milliseconds for session 
     */ 
     public STARConnection(string username, string password, int loginTimeout, int overallTimeout) 
     { 
      output = ""; 
      conn = new TelnetConnection("HOSTHOSTHOST", 23); 
      this.SetTimeout(overallTimeout); 
      try 
      { 
       output = conn.Login(username, password, loginTimeout); 
       if(output.Contains("You entered an invalid login name or password")) 
       { 
        throw new LoginException("Failed to login"); 
       } 
       this.ParsePrompt(); 
      } 
      catch(Exception e) 
      { 
       if(e.Message.Contains("login prompt")) 
       { 
        throw new PromptException("Login", "Could not find login prompt"); 
       } 
       else if(e.Message.Contains("password prompt")) 
       { 
        throw new PromptException("Password", "Could not find password prompt"); 
       } 
       else 
       { 
        throw e; 
       } 
      } 
     } 

     /** 
     * Sets the timeout for the session in milliseconds 
     * @param [in] int timeout:timeout for session 
     */ 
     public void SetTimeout(int timeout) 
     { 
      conn.MainTimeOutMs = timeout; 
      conn.TimeOutMs = timeout; 
     } 

     /** 
     * Gets the current timeout for the session in milliseconds 
     * @param [out] int:timout for session 
     */ 
     public int GetTimeout() 
     { 
      return conn.TimeOutMs; 
     } 

     /** 
     * Writes a command to the STAR session 
     * @param [in] string command:command to write 
     */ 
     public void Write(string command) 
     { 
      this.command = command; 
      conn.Write(this.command); 
      this.command = this.command.Replace("\n", "{newLine}"); 
     } 


     /** 
     * Writes a command followed by a new line (\n) to the STAR session 
     * @param [in] string command:command to write 
     */ 
     public void WriteLine(string command) 
     { 
      this.command = command; 
      conn.WriteLine(this.command); 
      this.command += "{newLine}"; 
     } 

     /** 
     * Reads output from STAR session. Assumes no data within given timeout denotes end of stream 
     * @param [out] string:output from STAR session 
     */ 
     public string Read() 
     { 
      output = conn.Read(); 
      this.ParsePrompt(); 
      return output; 
     } 

     /** 
     * Reads output from STAR session with timeout changed for only this read. Assumes no data within 
     * timeout denotes end of stream. 
     * @param [in] int timeout:timeout for this read only 
     * @param [out] string:output from STAR session 
     */ 
     public string Read(int timeout) 
     { 
      int temp = this.GetTimeout(); 
      this.SetTimeout(timeout); 
      this.Read(); 
      this.SetTimeout(temp); 
      return output; 
     } 

     /* 
     * Parse prompt from output 
     */ 
     private void ParsePrompt() 
     { 
      prompt = output.Substring(output.LastIndexOf("\n") + 1); 
     } 

     /** 
     * Gets output from last read 
     * @param [out] string:output from last read 
     */ 
     public string GetOutput() 
     { 
      return output; 
     } 

     /** 
     * Gets last command entered 
     * @param [out] string:last command entered 
     */ 
     public string GetCommand() 
     { 
      return command; 
     } 

     /** 
     * Gets prompt from last read 
     * @param [out] string:last prompt 
     */ 
     public string GetPrompt() 
     { 
      return prompt; 
     } 

     /** 
     * Checks for connection 
     * @param [out] bool:connection status 
     */ 
     public bool IsConnected() 
     { 
      return conn.IsConnected; 
     } 
    } 

    /** 
    * Exception for failed logins 
    */ 
    class LoginException: Exception 
    { 

     private string offender = ""; 
     public LoginException() : base() { } 
     public LoginException(string message) : base(message) { } 

     /** 
     * Creates exception 
     * @param string offender:element causing exception 
     * @param string message:exception message 
     */ 
     public LoginException(string offender, string message) 
      : base(message) 
     { 
      this.offender = offender; 
     } 

     /** 
     * To String method for getting exception string 
     * @param [out] string:string representation of exception 
     */ 
     public override string ToString() 
     { 
      if(offender == "") 
      { 
       return this.GetType() + ": "+this.Message+"\n"+this.StackTrace; 
      } 
      else 
      { 
       return "Incorrect login: " + offender + "--" + this.Message + "\n" + this.StackTrace; 
      } 
     } 
    } 

    /** 
    * Exception for failed STAR prompts 
    */ 
    class PromptException: Exception 
    { 

     private string prompt = ""; 
     public PromptException() : base(){ } 
     public PromptException(string message) : base(message){ } 

     /** 
     * Creates exeption 
     * @param string prompt:prompt causing exception 
     * @param string message:exception message 
     */ 
     public PromptException(string prompt, string message) 
      : base(message) 
     { 
      this.prompt = prompt; 
     } 

     /** 
     * To String method for getting exception string 
     * @param [out] string:string representation of exception 
     */ 
     public override string ToString() 
     { 
      if(prompt == "") 
      { 
       return this.GetType() + ": " + this.Message + "\n" + this.StackTrace; 
      } 
      else 
      { 
       return "Prompt failed: " + prompt + "--" + this.Message + "\n" + this.StackTrace; 
      } 
     } 

    } 
} 

AssemblyInfo.cs

using System.Reflection; 
using System.Runtime.CompilerServices; 
using System.Runtime.InteropServices; 

// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information 
// associated with an assembly. 
[assembly: AssemblyTitle("STARTelnet")] 
[assembly: AssemblyDescription("")] 
[assembly: AssemblyConfiguration("")] 
[assembly: AssemblyCompany("COMPANY")] 
[assembly: AssemblyProduct("STARTelnet")] 
[assembly: AssemblyCopyright("Copyright © COMPANY 2012")] 
[assembly: AssemblyTrademark("")] 
[assembly: AssemblyCulture("")] 

// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components. If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type. 
[assembly: ComVisible(true)] 

// The following GUID is for the ID of the typelib if this project is exposed to COM 
[assembly: Guid("d7ae512d-c840-4ebc-8057-73a10f286225")] 

// Version information for an assembly consists of the following four values: 
// 
//  Major Version 
//  Minor Version 
//  Build Number 
//  Revision 
// 
// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below: 
// [assembly: AssemblyVersion("1.0.*")] 
[assembly: AssemblyVersion("1.0.0.0")] 
[assembly: AssemblyFileVersion("1.0.0.0")] 
+0

エラーメッセージをわかりにくくしないでください.HEXVALUEHEREは私たちのお手伝いをしません。実際にプロジェクトを.NET 4の対象に変更した場合にのみ、バージョン4のRegasmを使用してください。 –

+0

プロジェクトを.NET 4に変更することはできません。互換性の問題については.NET2.0でなければなりません。私は.NETが後方互換性があるという印象を受けました。私は上記の16進コードを調整しました。 – steventnorris

+0

なぜ、バージョン2を使用するのではなく、バージョン4のRegasmに登録したいのですか? –

答えて

2

あなたのようなCOMサーバーには、いくらか特別なルールが適用されます。 .NET 4のCLRは、プロセスがCLRの複数のバージョンをホストできるように、CLRのインプロセス並列バージョン管理をサポートしています。これは、COMサーバーにとって特に重要です。以前は管理対象シェル拡張を確実に作成することが不可能になったCLRバージョンの注入問題を解決します。 CLRバージョン2以前では、プロセス内のCLRの1つのバージョンのみをサポートしていました。副作用により、COMサーバーがCLRを最初にロードしたものがあれば、後でCLRを必要とするCOMサーバーを後でロードすることが不可能になります。最初のCOMサーバーが1.0または1.1バージョンのCLRを読み込んだ場合は特に悪いことです。

.NET 4をターゲットにしたくない場合は、サーバーに登録できるように.NET 3.5 SP1をインストールするようユーザーに依頼する必要があります。また、クライアントプログラム用のapp.exe.configファイルを用意して、COMサーバーがCLRの以前のバージョン用にビルドされており、バージョン4のCLRで実行できることを認識していることをCLRに伝える必要があります。これにより、バージョン2のCLRが使用できなくなります。 .configファイルは次のようになります。

<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
     <supportedRuntime version="v4"/> 
     <supportedRuntime version="v2.0.50727"/> 
    </startup> 
</configuration> 

明らかに、あなたが実際にロードされたバージョン2 CLRを取得好むかもしれない唯一の4を持っていると覚えておいてくださいユーザーのために、.NET 4を標的とすることにより先になるでしょうクライアントプログラムが完全にネイティブであれば、それはおそらくコードをテストしたバージョンでしょう。バージョン4は互換性が高いですが、あなたのコードが意図せず依存する可能性のあるバグのバグ修正が数多くあります。

+0

ユーザーPCに配布するapp.exe.configファイルはどこにありますか、どのように編集すればいいですか?RegAsmにどのように結び付けますか?私はこれが "Framework"ディレクトリのどこかにあると仮定していますか?ユーザーはローカルPCの端末ウィンドウを使ってRegAsm経由でこのdllを登録します。 – steventnorris

+0

作成する必要があります。 Notepad.exeはうまくいくでしょう。 *クライアント*アプリケーションEXEを含むディレクトリに、クライアントプログラムの名前を使用して格納する必要があります。したがって、c:\ foo \ bar.exeがCOMサーバーを使用している場合は、c:\ foo \ bar.exe.configを作成する必要があります。 –

+0

COMサーバーの使用はどういう意味ですか?これはすべて、単一のユーザーPC上でローカルに実行されます。 – steventnorris

関連する問題