2010-11-23 18 views
0

私が是正しようとしているシナリオは、C#コードのコンパイル時にdllが見つかったが、c#コードが実行されたときに見つかりませんでした。これはPowershell 2.0です。私たちの方針はGACを使用しないことです。 PowerShellの機能のC#コードは、これと類似している:この関数が呼び出されると、C#コードは、タイムアウトエラーでコンパイルされPowershell 2.0ランタイム例外。ファイルまたはアセンブリをロードできませんでした

function functionDef 
{ 
    [System.Reflection.Assembly]::LoadFrom("c:\myDir\func1.dll") 
    [System.Reflection.Assembly]::LoadFrom("c:\myDir\func2.dll") 

    $ref = @("c:\myDir\func1.dll","c:\myDir\func2.dll") 

    $cCode = @" 
    using System; 
    using func1; 
    using func2; 

    namespace serializedDef 
    { 
     public class defSerialization 
     { 

      public defSerialization() {} 

    <# 
      method and properyty defs not included 
      #> 

      public double setSpec { 
    set { computeDef(value)} 
    get {return spefDef} 
      } 

    private double computeDef (double value) 
    { 
      <# calls to methods in DLLS loaded above 
      #> 
    } 
     } 
    } 
"@ 
add-type -ReferencedAssemblies $ref -TypeDefinition $cCode -passthru - Language CSharpVersion3 | out-null 
} 

2つの参照DLLSのパスを$ env:pathの値に追加します。サードパーティのDLLパスDLLが別の場所にインストールされています。そのパスも$ env:パスに追加されます。両方のパスのアクセス許可は、テスト目的で全員に広く公開されています。

I新しいオブジェクトとして、インスタンスC#のコードを:

$myObject = new-object serializedDef.defSerialization 

私は機能を呼び出すとき:

$myObject.setSpec = 35.5 

を私はエラーを取得:

Exception setting "setSpec": "Could not load file or assmbly 
'func1', Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0a7c34216660f47' or one of its dependencies. The system cannot find the file specified." 
At line:1 char:11 
+ $myObject. <<< setSpec = 35.5 
    + CategogyInfo   : InvalidOperation: (:) [], RuntimeException 
    + FullyQualifedErrorId : PropertyAssignmentException 

私の理解では、そのエラーは、見つからないDLLの1つが参照しているメソッドなどに関連している可能性があります。これをどのように追跡するのですか?

+0

fusglowを使用すると、「Bind to native image assembly not successful」というエラーが表示されます。 ILイメージを使用する '。メッセージを漠然と理解していますが、必要な変更をどのように実装するのか分かりません。 – user459866

答えて

-1

Answer 1(How can I get PowerShell Added-Types to use Added Types)に掲載された投稿後のソリューションをモデル化しました。 x87とx64の両方のプラットフォームで動作します。ありがとうございました。

+0

ここでのあなたの "答え"は本当に仲間のものです。オリジナルの質問または回答のいずれかにコメントとして追加する必要があります。また、あなたの提案された答えがあなたのために働くことを見つけるなら、あなたはその答えを*答えとしてマークしたいかもしれません。受け入れ率が高い方は、あなたの質問に将来的に答える可能性が高くなります。 :-) –

+0

私の答えは、記載されたリンクから解決策を実装することで私の問題が解決したと述べました。私は単にあなたの問題に解決策を提供するためにあなたに信用を与えたい – user459866

2

.NETアセンブリがパスから読み込まれません。アプリケーションの基本ディレクトリはPowerShellのインストールディレクトリであり、そこでアセンブリを実際にコピーする必要はありません。 AppDomain.AssemblyResolveイベントをフックすることをお勧めします。このイベントは、CLRがアセンブリを検出できないときに呼び出されます。この時点で、問題のアセンブリへの完全なパスを指定できます。詳細はSO postをご覧ください。

関連する問題