2011-09-30 124 views
5

我的CompileAssemblyFromSource適用於只引用我的程序(編譯它)使用的程序集的代碼。它的作品非常漂亮。C#CompileAssemblyFromSource,添加它需要的引用程序集?

但是,如果我需要編譯具有「使用等等」的代碼,聲明,它將無法找到它,並說它缺少一個資源。

因此,如果它是「System.Windows.Forms」,我說「compilerparams.ReferencedAssemblies.Add(」System.Windows.Forms.dll「)」,它的工作原理。

所以我可以解析代碼文件並獲取所有「使用」參數,但是如何知道這些應該是「* .dll」的添加項,或者它們是其他位置的名稱空間還是什麼?有沒有辦法讓.NET接受「System.Windows.Forms」並吐出「System.Windows.Forms.dll」,因爲這就是它所需要的,等等。

+0

無法找到程序集包含您的類,因爲名稱空間可以產生acr oss的asseblies和某人可以創建具有完全相同的類名稱和您使用的命名空間的DLL,所以你的代碼無法編譯。爲了解決一個問題,你必須提供二進制文件,比如說衛星程序集,以同樣的方式作爲參考以及你的源代碼,Visual Studio保存引用(包括哈希) –

+0

'Assembly.GetAssembly(typeof (的MyType))'??你必須知道哪些類型實際上正在使用,而不僅僅是使用語句,因爲單個命名空間可以來自多個程序集,每個@ArturMustafin – mellamokb

+0

@mellamokb:如果你的代碼如下所示:'Assembly.GetAssembly(typeof(MyType) )',這意味着類型'MyType'在complie時間是已知的(typeof'語句需要使用),無論是代碼本身還是編譯源代碼,情況並非如此。你的情況,你必須提供解決方法的AppDomain.AssemblyResolve事件處理程序來查找和下載程序集。但是,無論如何,正如所說的,你不能只依靠源代碼來解決問題。 –

回答

1
  1. 閱讀文章How the Runtime Locates Assemblies
  2. 編譯代碼加載所有在所有組件中的點提到的1
  3. 加載所有類型的地點發現了組件之前,保持命名空間的字典,類型對
  4. 當在源中遇到使用時,嘗試添加字典中的程序集引用3
相關問題